一. 成员变量的封装优点:外界无法随意修改类中成员变量的值,把内部变量隐藏起来,提高了程序的安全性。1、 set方法作用:1> 提供一个方法给外界用来设置成员变量值;2> 可以在方法里面过滤掉一些不合理的值。命名规范:1> 方法名必须以set开头;2> et后面跟上成员变量的名称,成员变量的首字母必须大写;3> 返回值一定是void;4> 一定要接收一个参数,而且参数类型跟成员变量类型一致;eg:-(void)setAge:(int)age{_age=age;}方法调用时和普通方法调用一样:[执行者 方法]eg:[p setAge:10];
2、get方法作用:返回对象内部的成员变量。命名规范:1> 肯定有返回值,返回值类型肯定和成员变量的类型一致。2> 方法名跟成员变量名一致。3> 不需要接收任何参数。eg:-(int)age{return _age;}方法调用和普通方法调用一样:[执行者 方法];eg: int age = [ p age];3、弱语法1> 在C语言中,随便调用一个函数,只要语法对,编译器只会警告,不会报错,只是在链接的时候报错;2> 在OC语言中,随便调用一个方法,编译器只会警告,不会报错,也可以链接成功,只是在运行时发生错误,经典错误信息如下:
提示错误:指针并未找到相应的方法(给对象Person发送了一个不能识别的方法test())3> 一旦程序在运行中出错,就会闪退。4、类方法(类调用、”+“开头、不能访问成员变量)1、方法分为两种:对象方法和类方法对象方法:1> 减号“-”开头;2> 只能由对象来调用;3> 对象方法中能访问当前对象的额成员变量。类方法: 1> 以加号”+“开头;2> 只能由类来调用;3> 类方法中不能访问成员变量。2、类方法的好处1> 不依赖于对象,执行效率高;2> 能用类方法,尽量用类方法;3、 使用场合:当方法内部不需要使用到成员变量的时候,就可以改为类方法。4、 在一个类中不可以同时存在两个同名的类/对象方法,但是可以同时存在同名类方法和对象方法。eg:-(viod)test;+(viod)test; // 可以
5、self关键字1. self是一个指针,指向调用当前方法的对象,即方法调用者。谁调用了方法,self就指向谁。看self所处的当前环境:self出现在对象方法中,self就代表对象;self出现在类方法中,self就代表类。2. self的用途:1>可以利用”self ->成员变量名“访问当前对象内部的成员变量;2>[self 方法名]可以调用其他对方法或类方法。3. self容易引发死循环。
二、继承(英文:)1、若类A继承类B,则B拥有A的所有东西(成员变量及方法)。此时称:类A是类B的父类,类B是类A的子类。特点:子类一旦继承了父类,则子类拥有父类中所有的成员变量和方法。优点:1>抽取重复代码;2>建立类之间的关系;3>子类拥有父类中所有属性和方法。缺点:耦合性强(父类的改变会影响到子类,如果一个类丢失,另外一个类也将不能使用)。
2、注意点:1> 基本上所有类的根类是NSObject;2> 子类和父类不能定义相同的成员变量;3> 允许子类和父类有相同的方法,调用某个对象的方法时,会优先调用子类的方法,然后再去父类中找。(一层一层往上找)4> 父类必须申明在子类前面(只要申明在前就可以了,方法可以写在后面)5> 每个类中都有一个superclass指针,指向自己的父类。eg:@interface Student:Person
3、组合与继承继承:xxx是xx,比如student是person(同一种类型范畴);组合:xxx拥有xx,比如student拥有Score@interface Student :NSObject { Score *_Score;//Score是另外一个类,Student类与Score类组合,Student拥有Score类的成员 }@end
4、Super关键字作用:1> 可以直接调用父类中的方法;2> 如果super处在对象方法中,就会调用父类的对象方法;如果super处在类方法中,就会调用父类中的类方法。使用场合:子类重写父类的方法时想保留父类的一些行为。(子类可以直接调用父类的某个方法[super 方法名 ])eg:在重写父类的基础上,再保留父类的方法:-(void)walk //重写父类的walk方法 { NSLog("往前走几步"); [super walk]; //调用父类的walk方法 }
三、多态(多种形态,父类指针指向子类对象)1、概念:某一类事物的多种形态。比如狗可以有多个形态,一是以狗的形式存在,二是以动物的形式存在。2、条件:一定要有继承,没有继承就没有多态。eg:Animal *a = [dog new]; // Animal是父类,dog是子类,狗是动物。Dog *d = [Animal new]; //错误,因为动物不一定是狗也可能是猫。3、优点:节省代码,提高效率。eg:4、局限性:父类类型的指针不能调用子类的方法(必须将父类指针强制转换为子类指针时才能调用子类中的方法)。//如果方法或函数参数中使用的是父类类型,则可以通过父类指针传入父类和子类对象。 viod feed(Animimal *a) //定义喂动物的函数 { [a eat]; } // 解析:上述函数的形参是父类Animal,所以函数可以传入父类和子类。这样的话狗和猫都能使用feed函数,节省代码。
eg:总之:1> 没有继承就没有多态;//Dog有一个run方法 int main() { Animal *a = [Dog new]; [a run];//编译时会警告,但是可运行,不建议这样写。 Dog *d = (Dog*)a;// 将父类指针a强制转换成子类指针d [d run]; }
2> 代码体现:父类类型的指针指向子类对象;eg:Animal *a = [Dog new];3> 好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象;4> 局限性:父类类型的变量,不能直接调用子类特有的方法。必须强制转换为子类类型变量后,才能直接调用子类特有的方法。
四、OC字符串
1、创建OC字符串的方法1> NNString *str = @"itcoast";// oc字符串以@开头2> NNString *str = [NSString stringWithFomat:@"my age is %d,number is %d",age,no];
2、长度算法:[str length]// 直接调用NSObject中的length方法,length方法计算的是字数(包括空格),并不是字符数。eg: “哈哈Jack”字数为6个字(汉字和字母一样都算一个字)占位符:%@
OC基础——封装、继承、多态
最新推荐文章于 2020-06-21 08:46:16 发布