面向对象编程的第一个特点: 继承。
继承在项目中由什么作用:减少重复代码的书写,增加其它特有的功能。
比如下图:
或者动物类又分:猫科动物和犬科动画等等。猫科里面又分狸花猫、布尔猫、星罗猫等。犬科里面有分:藏獒、黑背、田园犬等。
继承的关系:1、继承的上层是:父类,继承的下层是:子类。
2、继承是单向的,不能相互继承。
3、继承具有传递想。A继承于B,B继承于C,A具有B和C的特征和行为。
4、子类能继承父类的全部特征(变量和属相)和行为(方法)。
OC继承的特点: 1、单继承、没有父类的类称为跟类。
2、NSObject类为所有类的跟类。
3、继承的内容:所有实例变量和方法。
3、如果子类不满意父类的方法和实现,可以重写父类的方法。
以下为示例:
Person 为父类,定义共有的属性和方法。
Student 继承Person,可以有自己的属性和方法,也可以额重写父类的方法。
/ Person.h // Object-Class // // Created by 孙军伟 on 2018/6/3. // Copyright © 2018年 孙军伟. All rights reserved. // #import <Foundation/Foundation.h> @interface Person : NSObject { // 变量-名字 NSString *_name; // 变量-年龄 int _age; } @property (nonatomic, copy) NSString *name; @property (nonatomic, assign) int age; // 属性 - 性别 @property (nonatomic, strong) NSString *sex; // 自定义初始化 - (instancetype)initWithName:(NSString *)name age:(int)age sex:(NSString *)sex; // 方法 - (void)sayHi; @end
// // Person.m // Object-Class // // Created by 孙军伟 on 2018/6/3. // Copyright © 2018年 孙军伟. All rights reserved. // #import "Person.h" @implementation Person @synthesize name = _name; @synthesize age = _age; // 自定义初始化 - (instancetype)initWithName:(NSString *)name age:(int)age sex:(NSString *)sex { self.name = name; self.age = age; self.sex = sex; return self; } // 方法 - (void)sayHi { NSLog(@"Hello World %@ - %d - %@",self.name,self.age,self.sex); } @end
// // Student.h // Object-Class // // Created by 孙军伟 on 2018/6/3. // Copyright © 2018年 孙军伟. All rights reserved. // #import "Person.h" // 子类 父类 @interface Student : Person @property (nonatomic, strong) NSString *school; @property (nonatomic, strong) NSString *teach; @property (nonatomic, strong) NSString *number; //学号 @end
// // Student.m // Object-Class // // Created by 孙军伟 on 2018/6/3. // Copyright © 2018年 孙军伟. All rights reserved. // #import "Student.h" @implementation Student - (instancetype)init { // 父类的属性和变量 self.name = @"学生"; self.age = 18; // 子类自己的变量和属性 self.number = @"0412344"; return self; } - (void)sayHi{ NSLog(@"这是子类重写父类得方法!!!!"); } @end
继承如图:
继承中的方法执行:
给Student 发送sayHi消息,现在本类中查询是否实现sayHi方法。如果有就调用,没有这查找父类是否有sayHi方法,有就调用。如果没有则继续查找父类中是否实现了sayHi方法,如果有就调用,没有这继续向上查找。
如果要执行父类中的方法,怎么实现?
super . 是编译器指令,并非对象。
作用:给super发消息,执行父类中实现的方法。
比如:子类有自己的实现,但是如果想要使用父类中的实现,则可以向super方法消息。
现在在知道了继承,那子类继承父类后,子类怎样初始化父类中的实例变量?
先看一个完成的初始化方法。
- (instancetype)init { //给super发送init方法,即执行父类实现的init. self = [super init]; if (self) { // 初始化你设置 } // 返回初始化完成的对象。 return self; }
说明:
1、学习继承以前,没有 self = [super init]; 我们逐一为变量赋值。
2、学习继承以后,父类中声明的公共实例变量,由父类自己的初始化方法赋值。
3、子类除了父类中公共的实例变量之外的实例变量。在自身的初始化方法中优先调用父类的初始化方法。父类初始化成功后在初始化自身的变量。