三大特性:封装、继承、多态
封装:
成员变量的封装
为了过滤不合法的属性值,我们需要提供一个方法给外界设置age属性值
set方法
作用:提供一个方法给外界设置成员变量值
命名:方法名必须以set开头
set后面跟上成员变量的名称,成员变量的首字母必须大写
返回值一定是void
一定要接收一个参数,而且参数类型跟成员变量类型一致
形参变量的名称不能和成员变量一样
get方法:
作用:返回对象内部的成员变量的值
命名规范:
肯定有返回值,返回值类型肯定与成员变量类型一致
方法名跟成员变量名一样
不需要接收任何参数
成员变量尽量不要用@public
枚举定义方法:
typedof enum{
SexMan,
SexWoman
}Sex;
成员变量的命名规范:一定要以下划线 _开头
作用:
1、让成员变量和get方法的名称区分开
2、也可以和局部变量区分开,一看到下划线开头的变量,一般都是成员变量
OC本质上还是C语言,本质上还是面线过程的。还是弱语法。
没有声明没有实现:
调用没有声明的方法编译的时候只有警告。
只会在运行的时候报错:
-[Person test]: unrecognized selector sent to instance 0x7fe9804076a0:
给Person对象发送了一个不能识别的消息:test
有声明没有实现:
如果对象声明了一个方法,但是没有实现,编译的时候同样不会报错,只会有警告。只有在执行的时候会报错(错误和上面的一样)。
OC是在运行过程中才会检测对象有没有实现相应的方法(动态检测)
没有声明有实现:
这样写的话没有警告,也不会报错。
程序在运行过程中出错将会闪退。
类方法:
类方法都是以加号(+)开头
然后调用的时候直接使用类名调用[Person printClassName];
类方法只能使用类名调用,不能使用对象调用。
允许类方法的方法名和对象方法的方法名相同
在类方法中不能访问实例变量
对象方法:
-》减号 - 开头
-》只能有对象来调用
-》对象方法中能访问当前对象的成员变量(实例变量)
类方法:
-》加号 + 开头
-》只能由类(名)来调用
-》在类方法中不能访问实例变量
类方法的好处和使用场合:
-》不依赖于对象,执行效率高
-》能用类方法尽量用类方法
-》场合:当方法内部不需要使用到成员变量时,就可以改为类方法
工具类:
基本没有任何成员变量,里面的方法基本都是类方法。
self关键字
self:谁调用了当前方法,self就代表谁(self如果出现在对象方法中,self代表对象。self如果出现在类方法中,self就代表类)
当成员变量和局部变量同名时,采取就近原则,访问的是局部变量
用self访问成员变量,区分同名的局部变量
可以利用"self->成员变量名"访问当前对象内部的成员变量
可以利用[self 方法名];调用其他的对象方法\类方法
self不管是在类方法还是对象方法中,如果调用自己,那么就会形成死循环
在类方法中的self不能调用对象方法,对象方法中的self不能调用类方法
self不能调用函数
继承:
继承的好处:
1、抽取重复代码
2、建立了类之间的关系
3、子类可以拥有父类中的所有成员变量和方法
注意点:
基本上所有类的根类是NSObject
如果写在同一个文件中,那么父类必须s要写在前面
OC中不允许子类和父类拥有相同名称的成员变量
子类重新实现父类的某个方法,不需要像C#中的需要关键字
调用某个方法时,优先去当前类中找,如果找不到,就去父类中找
每个类中都有一个superclass指针,指向该类的父类
继承的坏处:耦合性太强了。
所以继承不能乱用
继承的使用场合:
1、当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
2、当A类拥有B类中的部分属性和方法时,可以考虑让B类继承A类
继承:xx是xxx
组合:xxx拥有xxx
组合:(学生继承成绩,在逻辑上不通,这时候就可以使用组合)
@interface Score : NSObject
{
int _cScore;
int _ocScore;
}
@end
@implementation Score
@end
@interface Student:NSObject
{
Score *_score;//这种方式就是组合
int _age;
}
@end
@implementation Student
@end
super:
调用父类的方法。(在重写父类的test方法中想调用父类的test方法或者其他方法,使用[super 方法名])
super处在对象方法中,那么就会调用父类中的对象方法
super处在类方法中,那么就会调用父类中的类方法
使用场景:
子类重写父类的方法时,想保留父类的一些行为
多态
父类指针指向子类对象
没有继承就没有多态
代码的体现:父类类型的指针指向子类对象
好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象
局限性:
父类类型的变量,不能直接调用子类特有的方法,必须强转成子类类型变量后,才能直接调用子类特有的方法。
调用方法的时候会检测对象的真实形象
如果参数中使用的是父类类型,可以传入父类、子类对象
多态的局限性:父类类型的变量,不能用来调用子类的方法。
Dog类继承自Animal类
Animal *aa=[Dog new];
Dog *dd=(Dog *)aa;//强制类型转换,将aa转换成Dog *类型的变量
如果有不对的地方请大家指正!!