OC中只允许单继承
没有⽗父类的类称为根类, OC 中的根类是 NSObject ( 祖宗 ) 。
继承的内容:所有实例变量和⽅方法。
如果⼦子类不满意父类方法的实现,可以重写父类的方法。
- (void)eat{
eat方法是由子类继承自父类Person中的,如果需要修改父类中的实现,则只需在类的实现部分重新定义该方法即可。
3.super
是编译器指令,并非对象。
作用:给super发消息,可以执行父类中实现的方法。当子类重写父类方法时,通过super执行父类的实现,又拥有自己的实现,相当于对父类已经定义的方法做扩展。
子类可以重写父类的方法,即子类既有自己的实现,又有父类继承下来的实现,如果想使用父类的实现,向super发送消息。
创建对象分两步:开辟空间,初始化。
初始化方法的主要作用是:为某些实例变量赋初值。
初始化方法在对象的整个生命周期里只使用一次。
学习继承之前,初始化方法,没有self=[super init] 字样。我们为 实例变量逐一赋值。
学习继承之后,父类生命了公共的实例变量。作为父类,也应该有自己的初始化方法,为这些公共实例变量赋初值。
5.
初始化方法是”-“方法
id或者instancetype类型的返回值
以init开头
可以带0到多个参数
内部实现:先执行super的初始化方法,在初始化自身变量,return self。
6.便利构造器
便利构造器是”+“方法,返回本类型的实例,方法名以类名开头。
可以有0到多个参数。
内部实现:封装了alloc和初始化方法。使用起来更加简洁。
7.具体案例实现分析
main.m里文件
#import <Foundation/Foundation.h>
//#import "Person.h"在Student里面已经导入过了 这里可以不再导入
#import "CollegeStudent.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *stu = [[Student alloc] initWhitName:@"wushi" gender:@"m" age:18 number:20140806 score:100];
[stu eat];//吃
[stu sleep];//睡
[stu study];//学
[stu test];//考
Student *xiaoming = [Student studentWhitName:@"xiaoming" gender:@"m" age:18 number:123456 score:1000];
}
return 0;
}
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;
NSString *_gender;
NSInteger _age;
}
- (void)eat;
- (void)sleep;
//初始化方法
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;
@end
#import "Person.h"
@implementation Person
- (void)eat{
NSLog(@"吃饭");
}
- (void)sleep{
NSLog(@"睡觉");
}
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{
self = [super init];//为父类继承实现初始化
if (self != nil) {
_name = name;
_gender = gender;
_age = age;
}
return self;
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Student : Person
{
NSInteger _number;
NSInteger _score;
}
//初始化方法
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age number:(NSInteger)number score:(NSInteger)score;
- (void)study;
- (void)test;
//遍历构造器 类名+ Whit 产生对象
//作用 快速创建对象,内部封装了创建对象的过程
//格式 1. + 号方法 2. 返回值为id类型 3.类名+ Whit 拼接上多个参数
+ (id)studentWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age number:(NSInteger)number score:(NSInteger)score;
@end
#import "Student.h"
@implementation Student
//eat方法是从父类继承过来的,而子类实现该方法,我们叫做重写父类的方法.
//继承时的方法会存在三种情况:
//1.表六对该父类方法的实现(实现方式,不重写方法)
//2.按子类冲写写hi后的方法进行实现(实现方式:重写方法 写自己的实现体,完全忽略父类方法)
//3.对于既有父类又有子类的方法实现: [super eat]; super调用的是父类继承过来的方法的实现 self对象调用自己的方法实现 [self eat];死循环了
- (void)eat{
//[self eat];死循环了
[super eat];//用来调用父类方法的实现.
NSLog(@"不吃不想吃");
}//私有方法 覆盖父类的方法 即:只在.m里实现 不在.h里声明
- (void)study{
NSLog(@"学习");
}
- (void)test{
NSLog(@"考试");
}
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age number:(NSInteger)number score:(NSInteger)score{
//初始化时本类只对自己独有的实例变量赋值即可
//利用self来接收 父类的初始化之
//super 调用父类对该初始化方法的实现,为从父类继承过来的实例变量赋值
//初始化方法必须是 initWhit 开头
self = [super initWhitName:name gender:gender age:age];
if (self != nil) {
_number = number;
_score = score;
}
return self;
}
//便利构造器的实现
+ (id)studentWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age number:(NSInteger)number score:(NSInteger)score{
//创建该类的对象 创建对象的两步
return [[Student alloc] initWhitName:name gender:gender age:age number:number score:score];
}
@end
#import <Foundation/Foundation.h>
#import "Student.h"
@interface CollegeStudent : Student
{
NSString *_major;//专业
}
//初始化方法
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age number:(NSInteger)number score:(NSInteger)score major:(NSString *)major;
@end
#import "CollegeStudent.h"
@implementation CollegeStudent
//初始化的实现
- (id)initWhitName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age number:(NSInteger)number score:(NSInteger)score major:(NSString *)major{
//先为从父类继承过来的实例变量赋初值
self =[super initWhitName:name gender:gender age:age number:number score:score];
//再为自己的独有的实例方法赋初值
if (self != nil) {
_major = major;
}
return self;
}
@end