OC语言03

继承
1.概述       在OC里一个类可以继承另外一个类,被继承的成为父类,继承的成为子类.需要注意的是:OC里只允许单继承,即一个子类只能只有一个父类,但一个父类可以有多个子类.父类本身也可以也可以有父类,没有父类的类位于类的最顶层,成为根类.就是NSObject这个类.只要定义一个新的类,就会继承父类中除了@private实例变量和私有方法之外的全部内容.从父类继承过来的东西属于自己的,不再是父类的.
继承具有传递性:A继承B,B继承C那么A也就继承C的内容.
 :  表示继承
继承的上层:父类,继承的下层:子类
继承是单向的,不能相互 继承,通过继承,子类可以继承,父类的数据,在子类的声明和方法里可以删除父类所具有的部分.
2. 继承特点
OC中只允许单继承
没有⽗父类的类称为根类, OC 中的根类是 NSObject ( 祖宗 ) 。 
继承的内容:所有实例变量和⽅方法。
如果⼦子类不满意父类方法的实现,可以重写父类的方法。
- (void)eat{    NSLog(@"%@ 在吃草 ",_name); }
eat方法是由子类继承自父类Person中的,如果需要修改父类中的实现,则只需在类的实现部分重新定义该方法即可。

3.super 

是编译器指令,并非对象。

作用:给super发消息,可以执行父类中实现的方法。
当子类重写父类方法时,通过super执行父类的实现,又拥有自己的实现,相当于对父类已经定义的方法做扩展。
子类可以重写父类的方法,即子类既有自己的实现,又有父类继承下来的实现,如果想使用父类的实现,向super发送消息。


  4.初始化方法
创建对象分两步:开辟空间,初始化。
初始化方法的主要作用是:为某些实例变量赋初值。
初始化方法在对象的整个生命周期里只使用一次。
学习继承之前,初始化方法,没有self=[super init] 字样。我们为 实例变量逐一赋值。
 学习继承之后,父类生命了公共的实例变量。作为父类,也应该有自己的初始化方法,为这些公共实例变量赋初值。
  子类定义了除父类中公共实例变量之外的实例变量。在自身的初始化方法中,优先向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








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值