黑马程序员—OC语言的self关键字和super关键字
来源:互联网 发布:国际数据分析师 编辑:程序博客网 时间:2024/04/29 08:35
一、关于self关键字
1、概念:指向了当前对象(方法调用者)
2、谁调用了当前方法,self就代表谁
1)self出现在对象方法中,self就代表对象
2)self出现在类方法中,self就代表类
3、可以利用"self->成员变量名"访问当前对象内部的成员变量
4、[self 方法名]可以调用其他对象方法/类方法
5、我个人的理解:
1)self是一个指针,在每一个方法中都有一个self指针
2)self可以出现在所有的方法中(对象方法和类方法),不能在函数中
3)self指向调用者。(谁调用它就指向谁)
4)可以使用self->成员变量 访问成员变量,可以使用[self 方法名]调用方法
6、代码示例
1)代表对象的self
#import <Foundation/Foundation.h>@interface Dog : NSObject- (void)bark;- (void)run;@end@implementation Dog- (void)bark{ NSLog(@"汪汪汪");}- (void)run{ [self bark]; NSLog(@"跑跑跑");}@endint main(){ Dog *d = [Dog new]; [d run]; return 0;}上面程序中,[self bark]self调用了bark这个对象方法,由于对象方法的调用者必须是对象,而self就代表了一个对象,就相当于白话说的self等于Dog对象d,也就是“self出现在对象方法中,self就代表对象”,最后程序的输出结果就是字符串:“汪汪汪”“跑跑跑”。
2)代表类的self
/* 设计一个计算器类 * 求和 * 求平均值 */#import <Foundation/Foundation.h> // 工具类:基本没有任何成员变量,里面的方法基本都是类方法@interface JiSuanQi : NSObject+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;@end@implementation JiSuanQi+ (int)sumOfNum1:(int)num1 andNum2:(int)num2{ return num1 + num2;}+ (int)averageOfNum1:(int)num1 andNum2:(int)num2{ // 在这种情况下,self代表类 int sum = [self sumOfNum1:num1 andNum2:num2]; return sum / 2;}@endint main(){ int a = [JiSuanQi averageOfNum1:10 andNum2:12]; NSLog(@"a=%d",a );}上面的程序中,int sum = [self sumOfNum1:num1 andNum2:num2],因为sumOfNum1 andNum2方法是个工具类的类方法,调用者必须是类,也就是类才能调用类方法,这时,self就相当于是JiSuanQi这个类,证明了“self出现在类方法中,self就代表类”,最后程序输出结果为:a=11
3)self使用注意
@interface Person : NSObject- (void)test;+ (void)test;- (void)test1;+ (void)test2;- (void)haha1;+ (void)haha2;@end@implementation Person- (void)test{ NSLog(@"调用-test方法");}+ (void)test{ NSLog(@"调用+test方法");}- (void)test1{ [self test];}+ (void)test2{ [self test];}- (void)haha1{ NSLog(@"haha1------");}+ (void)haha2{ [self haha1];}@end注意:在对象方法test1中的[self test],self代表的是对象,所以会调用对象方法test,如果单纯的这行代码的结果会打印“调用的-test方法”;而类方法test2中的[self test],因为test2本身就是类方法,所以self代表了Person这个类,故会调用类方法test,打印“调用+test方法”;最后类方法haha2中的[self haha1],经过上面的分析很清楚的就知道此时的self代表了Person类,但是Person类中只有一个名为“haha1”的对象方法,而没有此名的类方法,所以会有警告!警告如下:warning: class method '+haha1' not found (return type defaults to 'id'); did you mean '+haha2'? [-Wobjc-method-access],就是说没有找到类方法haha1
二、关于super关键字
1、super的作用:直接调用父类中的某个方法
2、super处在对象方法中,那么就会调用父类的对象方法
3、super处在类方法中,那么就会调用父类的类方法
4、使用场合:子类重写父类的方法时想保留父类的一些行为
5、个人理解:
1)要想使用super关键字,必须要牵扯到父类和子类
2)super并不是隐藏的参数,它只是一个"编译器指示符"
6、代码示例:
#import <Foundation/Foundation.h>@interface Zoombie : NSObject- (void)walk;+ (void)test;- (void)test;@end@implementation Zoombie- (void)walk{ NSLog(@"往前挪两步******");}+ (void)test{ NSLog(@"Zoombie+test");}- (void)test{ NSLog(@"Zoombie-test");}@end@interface JumpZoombie : Zoombie+ (void)haha;- (void)haha2;@end@implementation JumpZoombie+ (void)haha{ [super test];}- (void)haha2{ [super test];}- (void)walk{ // 先跳两下 NSLog(@"跳两下"); // 走两下 [super walk];}@endint main(){ //[JumpZoombie haha]; JumpZoombie *jz = [JumpZoombie new]; [jz haha2]; return 0;}上面程序中定义了一个Zoombie类,然后定义了一个JumpZoombie类并让它继承于Zoombie类,在JumpZoombie类的类方法haha中的[super test],虽然父类Zoombie中名为test的对象方法和类方法各有一个,但是会调用类方法,故这句会打印:Zoombie+test ;在JumpZoombie类的对象方法haha2中的[super test]则会调用父类的对象方法,打印:Zoombie-test
0 0
- 黑马程序员—OC语言的self关键字和super关键字
- 黑马程序员-OC语言中的两个关键字self和super
- 黑马程序员-OC语言-self和super关键字(听课笔记)
- 黑马程序员-OC语言-关键字self与super
- ——黑马程序员——OC中self和super关键字的使用
- 黑马程序员——OC学习——self和super关键字
- 黑马程序员---关于super和self关键字
- 【黑马程序员】【OC语言】self关键字
- 黑马程序员——OC语言------set和get方法(封装)、类方法、self关键字
- 【黑马程序员】OC之self关键字的介绍
- 黑马程序员——OC之self关键字、多态
- 关键字”self”和”super”
- 黑马程序员_OC语言之类方法和关键字self
- 黑马程序员——Objective-C语言知识整理——匿名类与self/super关键字
- 黑马程序员-C语言-self和super
- OC学习self和super关键字(了解)
- iOS学习——self和super关键字的解析
- 黑马程序员-iOS学习日记(五)面向对象-self和super关键字
- HTTPS协议简介
- leetcode | Symmetric Tree
- 杭电acm1302
- 零碎知识点(未分类)
- Python爬虫的一些总结
- 黑马程序员—OC语言的self关键字和super关键字
- XML数据解析-SAX和DOM
- LintCode 丢失的第一个正整数
- 如何盗取别人的QQ密码
- Android开发基础之-----------补间动画
- pat1022Digital Library (30)
- 彻底搞定0x0d和0x0a
- linux sar
- Scala学习笔记03【学习识别Scala函数式风格】