iOS开发之OC语法基础(二)--继承和实例化

一、目标

1、掌握面向对象编程特性——继承

2、掌握OC中的自定义初始化方法

3、掌握OC中的便利构造器的写法


二、Objective-C

1、OC中,一个类可以继承另外一个类

2、被继承的类称为父类(super class)或超类

3、继承的类称为子类(subclass)

4、子类可以直接使用父类的部分特征和行为

注意:OC中只允许每个类有切只有一个父类,并且OC种的基类时NSObject!!!

5、实现继承很简单:在封装类的接口部分使用符号“:”

@interface childClass: superClass{
}
例如:

@interface Person: NSObject{
}

6、下面创建一个学生类:

Student.h

#import "Person.h"

@interface Student : Person{
    int number;//学号
    float score;//分数
}
- (void)study;

@end
Student继承于Person类,除了包含自身特征和行为外,还包含父类的特征和行为!!

三、继承

1、子类能直接继承父类的方法

2、还可以重写父类的方法(子类自己实现行为)

3、子类重写了父类的方法,调用过程中执行子类的方法

4、继承具有传递性:如果A是B的子类,B是C的子类,那么A也具有C的特性和行为

四、方法

1、在OC语言里,方法分两大类:类(+)方法和实例(-)方法:

类方法必须用类(名)来调用,实例方法必须用对象来调用

方法是类的行为,在接口文件中声明,在实现文件中实现

例如:

setter、getter都是OC中的方法

除了上一篇定义的那些方法,OC中同样有多参方法

(1)子类调用父类的方法,新建一个Student继承Person

Student.h

#import "Person.h"

@interface Student : Person

@end
Student.m
#import "Student.h"

@implementation Student

@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"

int main(int argc, const char * argv[]) {
    //实例化Student类的实例对象
    Student *student = [[Student alloc]init];
    [student setName:@"Jack"];
    [student sayHi];
    
    return 0;
}

(2)重写父类的方法,重写父类的方法不需要再次声明

Student.h

#import "Person.h"

@interface Student : Person

@end
Student.m
#import "Student.h"

@implementation Student

- (void)sayHi{
    NSLog(@"学生的姓名是%@",name);
}

@end

main.m

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"

int main(int argc, const char * argv[]) {
    //实例化Student类的实例对象
    Student *student = [[Student alloc]init];
    [student setName:@"Jack"];
    [student sayHi];
    
    return 0;
}

2、自定义初始化方法

(1)创建对象分两步:分配空间和初始化

(2)初始化方法的作用就是为对象赋初始值

(3)初始化方法通常以init开头

例如:

- (id)initWithName:(NSString *)name;
注意:一个类可以包含多个初始化方法!!

3、self、super

self和super是OC语言中的关键字:

super:将消息发送给父类对象

self:将消息发送给本对象

self始终代表接收消息的对象

4、指定初始化方法

一个类有且只有一个指定初始化方法,在众多的初始化方法中,无论你调用哪个初始化方法,指定初始化方法都会执行,指定初始化方法会跟父类初始化方法有一定联系。

5、便利构造器

便利构造器是一种快速创建对象的方式。它本质上是把初始化方法做了一次封装,方便外界使用。

便利构造器是一个类方法。(以+开头)

<span style="font-size:14px;">+(UIButton *)buttonWithType(UIButton Type)buttonType;</span>

6、事例:为Student类添加自定义初始化方法、为Student类添加指定初始化方法、为Student类添加便利构造器方法

Student.h

#import "Person.h"

@interface Student : Person{
    //学号
    NSInteger number;
    //分数
    CGFloat score;
}
//指定初始化方法,通常情况下是能够赋初始值最多的方法
- (id)initWithName:(NSString *)_name
               Age:(NSInteger)_age
            Gender:(NSString *)_gender
            Number:(NSInteger)_number
             Score:(CGFloat)_score;
//自定义初始化方法
- (id)initWithName:(NSString *)_name;
- (id)initWithNumber:(NSInteger)_number;

//便利构造器
+ (id)studentWithName:(NSString *)_name;
+ (id)studentWithNumber:(NSInteger)_number;
+ (id)studentWithName:(NSString *)_name
                  Age:(NSInteger)_age
               Gender:(NSString *)_gender
               Number:(NSInteger)_number
                Score:(CGFloat)_score;

//自定义初始化方法
//指定初始化方法
//便利构造器

@end
Student.m
#import "Student.h"

@implementation Student

//指定初始化方法,通常情况下是能够赋初始值最多的方法
- (id)initWithName:(NSString *)_name
               Age:(NSInteger)_age
            Gender:(NSString *)_gender
            Number:(NSInteger)_number
             Score:(CGFloat)_score{
    //self 指的就是将消息发送给本对象
    //super 指的就是将消息发送给父类对象
    self = [super init];//[super init]就是将消息init发送给学生类的父类Person进行执行
    if(self != nil){
        name = _name;
        age = _age;
        gender = _gender;
        number = _number;
        score = _score;
    }
    return self;
}

//自定义初始化方法
- (id)initWithName:(NSString *)_name{
    return [self initWithName:_name Age:0 Gender:nil Number:0 Score:0.0f];
}
- (id)initWithNumber:(NSInteger)_number{
    return [self initWithName:nil Age:0 Gender:nil Number:_number Score:0.0f];
}

//便利构造器
+ (id)studentWithName:(NSString *)_name{
    Student *student = [[Student alloc]initWithName:_name];
    return student;
}
+ (id)studentWithNumber:(NSInteger)_number{
    Student *student = [[Student alloc]initWithNumber:_number];
    return student;
}
+ (id)studentWithName:(NSString *)_name
                  Age:(NSInteger)_age
               Gender:(NSString *)_gender
               Number:(NSInteger)_number
                Score:(CGFloat)_score{
    Student *student = [[Student alloc]initWithName:_name
            Age:_age Gender:_gender Number:_number Score:_score];
    return student;
}

- (void)sayHi{
    NSLog(@"学生的姓名是%@",name);
}

@end
mian.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"

int main(int argc, const char * argv[]) {
    //实例化Student类的实例对象
    Student *student = [[Student alloc]init];
    [student setName:@"Jack"];
    [student sayHi];
    
    
    //通过便利构造器创建实例对象
    Student *autoStudent = [Student studentWithName:@"xiaoa"];
    [autoStudent sayHi];
    
    return 0;
}

五、总结

1、OC只允许单继承,继承具有传递性

2、子类从父类继承了部分特征和行为。

3、子类可以重写父类方法,定制自己个性化的行为。

4、OC中的方法:类方法和实例方法。

5、OC中的实例化方法:自定义初始化方法和便利构造器。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值