总目录 iOS开发笔记目录 从一无所知到入门

文章目录

IntroDemo代码Output

Intro

以下内容包含:

子类继承父类的类声明;子类继承父类后的方法调用特性;self和super的使用;self在对象方法中表示当前对象,在类方法中表示本类(可以在方法内部使用 %p打印该指针值证明);子类中如何重写继承自父类的方法、重写后在子类方法中使用self和super调用该方法的效果;

Demo

代码

//

// main.m

// 类的继承

//

// Created by wuyujin1997 on 2023/2/25.

//

#import

@interface Father : NSObject {

NSString* _fatherField;

}

+ (void) fatherClassFunc;

- (void) fatherObjFunc;

// getter & setter

- (NSString*) fatherField;

- (void) setFatherField:(NSString*)fatherField;

@end

@implementation Father

+ (void) fatherClassFunc {

NSLog(@"父类的类方法");

}

- (void) fatherObjFunc {

NSLog(@"父类的成员方法");

}

- (NSString*) fatherField {

return self->_fatherField;

}

- (void) setFatherField:(NSString*)fatherField {

self->_fatherField = fatherField;

}

@end

@interface Son : Father {

NSString* _sonField;

}

+ (void) sonClassFunc;

- (void) sonObjFunc;

// getter & setter

- (NSString*) sonField;

- (void) setSonField:(NSString*)sonField;

@end

@implementation Son

+ (void) sonClassFunc {

NSLog(@"===>子类的类方法 start 子类的类方法中可以使用 super 调用继承自父类的类方法");

[super fatherClassFunc]; // 这四种写法都会可以调用到继承自父类、现在也属于子类的方法。

[self fatherClassFunc];

[Father fatherClassFunc];

[Son fatherClassFunc];

NSLog(@">>>>>>>>>>>类方法中的self地址: %p", self);

NSLog(@"===>子类的类方法 end");

}

- (void) sonObjFunc {

NSLog(@"===>子类的对象方法 start 子类对象方法中可以调用继承自父类的对象方法");

[super fatherObjFunc]; // 一定会调用父类的该方法

[self fatherObjFunc]; // 如果子类重写了该方法,就调用子类自己的。如果没有,这个self就相当于super,会去调用父类的。

NSLog(@"子类方法中访问子类的成员属性:%@", self->_sonField);

// NSString* fatherField = super->_fatherField; // Use of undeclared identifier 'super'

NSLog(@">>>>>>>>>>>对象方法中的self地址:%p", self);

NSLog(@"===>子类的对象方法 end");

}

- (NSString*) sonField {

return self->_sonField;

}

- (void) setSonField:(NSString*)sonField {

self->_sonField = sonField;

}

// 子类中重写一个与父类方法同名的方法

- (void) fatherObjFunc {

NSLog(@"子类中重写的与一个父类方法同名的方法");

}

@end

int main(int argc, const char * argv[]) {

NSLog(@"类的继承中属性和方法的继承特性、子类重写继承自父类的方法self和super指针的使用");

Father* fatherObj = [Father new];

[fatherObj fatherObjFunc];

[Father fatherClassFunc];

// 对象不能去调用类方法

// [p fatherClassFunc]; // No visible @interface for 'Father' declares the selector 'fatherClassFunc'

Son* sonObj = [Son new];

[sonObj setFatherField:@"fatherFieldValue"]; // 子类对象调用继承自父类的成员方法。

[sonObj setSonField:@"sonFieldValue"];

[sonObj sonObjFunc];

[Son sonClassFunc];

NSLog(@">>>>>>>>>>>Son类的地址:%p", [Son class]);

NSLog(@">>>>>>>>>>>son对象的地址:%p", sonObj);

return 0;

}

Output

注意看打印出的Son对象地址的两个值相同:0x600000202140,类地址(Son的Class对象)的两个值也相同:0x100008258。

2023-02-27 22:35:50.330564+0800 类的继承[39283:1161074] 类的继承中属性和方法的继承特性、子类重写继承自父类的方法self和super指针的使用

2023-02-27 22:35:50.330816+0800 类的继承[39283:1161074] 父类的成员方法

2023-02-27 22:35:50.330838+0800 类的继承[39283:1161074] 父类的类方法

2023-02-27 22:35:50.330857+0800 类的继承[39283:1161074] ===>子类的对象方法 start 子类对象方法中可以调用继承自父类的对象方法

2023-02-27 22:35:50.330872+0800 类的继承[39283:1161074] 父类的成员方法

2023-02-27 22:35:50.330887+0800 类的继承[39283:1161074] 子类中重写的与一个父类方法同名的方法

2023-02-27 22:35:50.330907+0800 类的继承[39283:1161074] 子类方法中访问子类的成员属性:sonFieldValue

2023-02-27 22:35:50.330933+0800 类的继承[39283:1161074] >>>>>>>>>>>对象方法中的self地址:0x600000202140

2023-02-27 22:35:50.331082+0800 类的继承[39283:1161074] ===>子类的对象方法 end

2023-02-27 22:35:50.331183+0800 类的继承[39283:1161074] ===>子类的类方法 start 子类的类方法中可以使用 super 调用继承自父类的类方法

2023-02-27 22:35:50.331235+0800 类的继承[39283:1161074] 父类的类方法

2023-02-27 22:35:50.331297+0800 类的继承[39283:1161074] 父类的类方法

2023-02-27 22:35:50.331356+0800 类的继承[39283:1161074] 父类的类方法

2023-02-27 22:35:50.331424+0800 类的继承[39283:1161074] 父类的类方法

2023-02-27 22:35:50.331487+0800 类的继承[39283:1161074] >>>>>>>>>>>类方法中的self地址: 0x100008258

2023-02-27 22:35:50.331546+0800 类的继承[39283:1161074] ===>子类的类方法 end

2023-02-27 22:35:50.331605+0800 类的继承[39283:1161074] >>>>>>>>>>>Son类的地址:0x100008258

2023-02-27 22:35:50.331664+0800 类的继承[39283:1161074] >>>>>>>>>>>son对象的地址:0x600000202140

Program ended with exit code: 0

好文阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: