面向对象编程的第一个特点: 继承。
继承在项目中由什么作用:减少重复代码的书写,增加其它特有的功能。
比如下图:
或者动物类又分:猫科动物和犬科动画等等。猫科里面又分狸花猫、布尔猫、星罗猫等。犬科里面有分:藏獒、黑背、田园犬等。
继承的关系: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、子类除了父类中公共的实例变量之外的实例变量。在自身的初始化方法中优先调用父类的初始化方法。父类初始化成功后在初始化自身的变量。