提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
继承时面向对象的三大特性之一。OC具有单继承的特点,每个子类只有一个直接父类
一、继承的特点
实现继承的类叫子类,被继承的类叫父类。子类是一种特殊的父类,因此父类包含的范围总比子类包含的范围要大,因此可以认为父类是大类,子类是小类。
继承关系的本质是一种“由一般到特殊的关系”。可以说子类扩展了父类
当子类扩展父类时,子类可以继承得到父类如下的东西:
- 全部成员变量
- 全部方法(包括初始化方法)
父类实现部分:
子类接口部分:
函数部分:
函数部分直接创建创建子类的对象来调用父类的方法。
同时我们要知道在OC中每个类最多只有一个直接父类,
二、重写父类的方法
我们的子类不可能具备父类的所有特征,例如蔡徐坤和只因,若我们以蔡徐坤为为父类,只因为子类,子类就就不包括我们父类会打篮球的技能
因此此时我们就需要为我们的子类重写方法。但大部分时候子类都是以父类为基础,增加新的field和方法。
父类方法:
子类重写父类方法:
函数部分:
最后调用的方法是子类重写的父类的方法。
三、super关键字
super关键字可以用来在子类方法中调用父类被覆盖的实例方法。
实现部分:
函数部分:
super用于限定该对象调用它从父类继承得到的属性或方法。但他正如self一样不能出现在类方法中,super也只能调用实例方法,因为类方法的调用者是类本身。
当子类继承父类时,子类可以获得父类中定义的成员变量,因此子类接口部分不允许定义与父类接口重名的成员变量。但是父类在实现部分定义的成员变量对子类没有任何影响。同时反过来也一样。
例子:
子类实现部分:
父类实现部分:
函数部分:
很明显看到我们覆盖了父类中的定义方法,但是我们的函数部分依然输出了两个值。
我们的程序实际上值创建了一个FKsub对象,但是对象内部依然有两块内存来保存a的成员变量
一块保存父类中被隐藏的_a成员变量,可以通过父类中定义的方法来访问。
一块保存子类实现部分定义的_a成员变量,可以通过子类方法直接访问
但我们用self输出的是父类中赋的值。
总结
OC中的继承一般是单继承,也就是说一个子类只能有一个爸爸,但他还可以有爷爷,爷爷就是他的剪接父类。
重写父类方法时方法名和形参标签一定要完全相同,否则就不能叫方法重写。这种重写我们叫方法重写或方法覆盖。
使用super关键字可以在子类中调用被覆盖的成员变量以及方法,不过方法一定是实例方法。
同时我们不能在父类与子类的接口部分定义相同名字的成员变量,但可以在不同类的实现部分与接口部分分别定义名字相同的成员变量。