A ----> 继承概要
1)面对对象的三大特性:封装、继承、多态
2)继承即能保证类的完整, 又能简化代码
3)定义三个类: 普通僵尸、路障僵尸、铁桶僵尸,这三个类有很多重复的实例变量和方法,比如:血量、攻击力、移动速度;行走,攻击,死亡。 面对对象的继承特性大大简化代码。
把公共的实例变量写在父类里 , 子类只需要写自己独有的实例变量和方法即可。
B ---- > 继承特点
1)继承的上层:父类; 继承的下层:子类
2)继承的内容 : 所有的实例变量和方法
3)继承是单向的, 不能相互继承
4) 继承具有传递性: A 继承与 B , B 继承与 C , A 具有 B 和 C 的特征和行为
5)如果子类不满意父类方法的实现, 可以重写(overwrite)父类的方法
C ---- > 重写从父类继承来的方法的不同情况
1)完全以子类的实现内容为主,丢弃父类实现的内容。
2)完全以父类的实现内容为主, 没有子类实现的内容
3)既有父类对该方法的时下, 也有子类对该方法的实现
D ---- > super
1)super 是编译器指令, 并非对象
2) 作用: 给 super 发消息, 可以指向父类该方法的实现
E ---- > 继承中方法的执行
1、OC 中方法调用采用消息发送机制 【 receiver message 】;
2、给 CollegeStudent 对象发送消息 : study
1)查找本类是否实现 study(重写) 方法
2)如果没有, 查找父类中 study 是否实现
3)逐级向上查找, 找到即执行
4)如果 NSObject 也没有实现, 会抛出异常, 引起 crash
F --- > 初始化方法步骤
1、创建对象分两步:1)为对象分配空间 2)进行初始化操作
2、初始化方法的主要作用是 : 为某些实例变量赋初值
3、初始化方法在对象的整个生命周期里只使用一次
4、初始化方法实在对象的初始化阶段完成其实例变量的赋值操作,一个对象的初始化阶段只有一次,所以初始化方法只使用一次
G ---- > 初始化实例
- ( id )init{
// 给super 发送 init 消息:执行父类中实现的 init 方法
self = [super init];
// 判断从父类继承过来的 init 方法 是否初始化成功
if ( self ){
// 初始化设置
}
//返回初始化完成的对象
return self;
}
子类定义了除父类中公共实例变量之外的实例变量
在自身的初始化方法中, 优先向super 发送 init 消息,初始化公共变量, 初始化成功后, 再初始化自身持有变量, 从而完成所有实例变量的初始化
H ---- > self
1、self 是系统关键字。self 在方法中指代当前方法的调用者
2、self 在实例方法中, 指代调用当前方法的对象
3、self 在类方法中, 指代当前类
I ---- > 初始化方法特征
1、初始化方法是 “-” 方法
2、id 或 instancetype 类型的返回值
3、以 init 开头
4、可以带 0 到多个参数。
5、内部实现 : 限制性super 初始化方法, 再初始化自身变量, 后 return self
J ---- > 初始化过程
1、自己的初始化方法中,优先调用父类的初始化方法。
2、父类的初始化方法再调用父类的初始化方法,依次往上调
3、处于最上层的初始化完成之后,回到第二层的初始化方法中,完成第二层的初始化
4、第二层的初始化完成后,回到第三层的初始化方法中,依次执行初始化方法,直到本类的初始化方法完成
K ---- > 指定初始化方法
1、一个类可以有多个初始化方法
2、虽然有多个初始化方法, 但是一个对象只能使用一个初始化方法。
例如 : initWithName: initWithGender: initWithName: gender:
3、指定初始化方法 : 无论调用哪一个初始化方法都会调用的初始化方法
4、通常把初始化想做的全部操作放到指定初始化方法中,这样就无需在每一个初始化方法中都要写一遍,简化代码,方便后期维护
5、选取原则 : 一般选参数最多的初始化方法作为指定初始化方法
L ---- > 便利构造器简述
1、封装类对象创建过程 : 内部实现: 封装了alloc 和初始化操作, 创建对象更加方便快捷
2、1)便利构造器是 “ + ” 方法
2)返回本类型的实例
3)方法名以类名开头
4)可以有 0 到多个参数 + (id)personWithName : gender : age :
M ----- > 小结
1、继承是面对对象的三大特性之一, 合理的继承, 能减少很多 冗余代码,加快开发速度。
2、初始化方法以 init 开头,在对象的生命周期中只使用一次
3、遍历构造器封装了对象的创建过程, 进一步简化了创建的步骤。