首页 > 代码库 > iOS学习笔记---oc语言第三天
iOS学习笔记---oc语言第三天
继承、初始化方法
一、继承
继承的上层:父类 继承的下层:子类
继承是单向的,不能相互继承
继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为
子类能继承父类全部的特征和行为(私有变量也继承过来了,只是不能访问)
面向对象提供了继承语法。能大大简化代码,把公共的方法和实例对象写在父类里。子类只需要写自己独有的实例变量和方法即可
继承既能保证类的完整,又能简化代码
继承特点
oc中只允许单继承
没有父类的类称为根类,oc中得根类是NSObject(祖宗)
继承的内容:所有的实例变量和方法
如果子类不满意父类方法的实现,可以重写父类的方法
继承树
继承中方法的执行
super 关键字
super是编译器指令,并?对象。
作用:给super发消息,可以执??类中实现的?方法。
?类可以重写?类的?法,即:?类既有自己的实现,?有父 类继承下来的实现,如果想使?用父类的实现,向super发送消息
//重写sayHi方法- (void)sayHi{ [super sayHi];//调用父类sayHi方法 NSLog(@"ok");}
- (void)study//学习{ [super sayHi];//调用父类sayHi方法 [self sayHi];//调用自身sayHi方法 NSLog(@"%@ 我正在努力学习",_name);}
二、初始化方法
创建对象分两步:开辟空间、初始化。
初始化?方法的主要作?用是:为某些实例变量赋初值。
初始化?方法在对象的整个?生命周期?里只使?用?一次。
- (instancetype)initwithName:(NSString *)name sex:(NSString *)sex number:(NSInteger)number;//instancetype取代id- (id)initwithName:(NSString *)name sex:(NSString *)sex number:(NSInteger)number;
//初始化的时候,优先调用父类的初始化方法,初始化父类中的变量,然后在初始化自己的变量。
//每个类都清楚自己独有的变量,因此。初始化方法里仅仅初始化自己独有的变量,通过调用父类的初始化方法,初始化继承过来的变量
///经过一番调用之后,继承树上的所有变量都可以得到初始化
//最不科学的初始化方法:在子类里面,为每一个变量赋值,因为,你需要自己查阅都继承了哪些变量。
?类定义了除?类中公共实例变量之外的实例变量。在自身的初始 化方法中,优先向super发送init消息,初始化公共变量,初始化成 功之后,再初始化?身特有变量,从?完成全部实例变量的初始化。
初始化过程
1. 执?行?父类中实现的初始化?方法。(向上递归到NSObject类中的初始化?方法)
2. 从根类NSObject开始执?行初始化?方法。
3. 判断?父类中的初始化是否成功,即self是否存在。
4. 完成对象的初始化设置,返回对象。
5. 初始化?子类实例变量。
初始化方法特征
初始化?方法是 “-”?方法
id或者instancetype类型的返回值
以init开头
可以带0到多个参数 内部实现:先执?行super的初始化?方法,再初始化?自?身变量,return self。
三、便利构造器
便利构造器在初始化方法的基础上前进了?小步。
封装了对象创建过程。
便利构造器是“+”?法,返回本类型的实例,?法名以类名开头。
可以有0到多个参数。 内部实现:封装了alloc和初始化?法。使?用起来更加简洁
实现函数中代码
+ (Student *)studentWithName:(NSString *)name sex:(NSString *)sex hobby:(NSString *)hobby age:(NSInteger)age number:(NSInteger)number{ return [[Student alloc] initWithName:name sex:sex hobby:hobby age:age number:number];}
主函数内代码 Student *student1 = [Student studentWithName:@"wangw" sex:@"man" hobby:@"xuexi" age:18 number:12];