Object-C 类的继承和初始化方法

面向对象编程的第一个特点: 继承。

继承在项目中由什么作用:减少重复代码的书写,增加其它特有的功能。

比如下图:


或者动物类又分:猫科动物和犬科动画等等。猫科里面又分狸花猫、布尔猫、星罗猫等。犬科里面有分:藏獒、黑背、田园犬等。

继承的关系: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、子类除了父类中公共的实例变量之外的实例变量。在自身的初始化方法中优先调用父类的初始化方法。父类初始化成功后在初始化自身的变量。








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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值