黑马程序员-C语言-self和super

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
self是什么?
self 可以在类中用来表示调用者,去调用方法.或属性。

注意: 当self调用属性时,只在对象方法中.因为类方法中不能用属性.
self调用属性,只表示类的对象.

self的规则
1,实例方法里面的self,是对象的首地址。
2,类方法里面的self,是Class.
尽管在同一个类里面的使用self,但是self却有着不同的解读。在类方法里面的self,可以翻译成class self;在实例方法里面的self,应该被翻译成为object self。在类方法里面的self和实例方法里面的self有着本质上的不同,尽管他们的名字都叫self。
代码体现、

#import <Foundation/Foundation.h>
@interface Person : NSObject{
    char *_name;
}
-(void)setName:(char *)name;

-(void)smile;
-(void)talk;
+(void)haha;
+(void)haha2;


@end

@implementation Person

-(void)setName:(char *)name{
    _name=name;
}

+(void)haha{
    NSLog(@"haha..很开心..");
    //self->_name;//错误,不能在类方法中访问属性
}

+(void)haha2{
    //在类方法中,表示的是类
    [self haha];
    NSLog(@"haha222..很开心..");
}

-(void)smile{
    char *_name="fred";
    //self表示调用这个方法的对象.而对象->name.这个取的是属性.
    NSLog(@"哈哈..很开心..%s",self->_name);
}

-(void)talk{
    //self:表示调用者.
    [self smile];//如果self是在对象方法中,则表示这个类的对象.
    NSLog(@"%s讲了一个笑话..",_name);
}

@end

int main(){

    Person *p=[Person new];
    [p setName:"judy"];
    [p smile];
    [Person haha];

//    Person *p1=[Person new];
//    [p1 talk];

   // [Person haha2];
    return 0;

}

关于self的一些思考
1.无论怎么样,self都是代表调用者,在类方法中使用,self就表示一个类,在对象方法中使用,self就表示一个对象.
2.self不能再主函数中出现,在主函数中调用方法时,必须使用创建的一个对象或者类来调用方法.
3.不要在方法中用self调用方法本身,这样会产生死递归:方法自已调用自已,容易引起死循环.
4.在类方法中可以通过创建一个对象来调用对象方法,但是这个对象不能用self来替代,因为在类方法中self只能代表一个类.

super的基本用法
super是一个关键字.
可以在子类中调用父类中被重写的方法.
调用方法:[super 方法名];
比如我们常见的构造方法中:

-(id)initWithName:(NSString*) name{
  if(self=[super init]){
    self.name=name;
  }
    return self;
}

以上[super init]就是调用了父类NSObject中的方法init; 因为init在子类中被重写了,所以想要调用父类中的init方法,必须用super.
super的特点
1.只能类方法调用类方法,对象方法中调用对象方法;
2.不建议用super调用父类中没有被重写的方法,可以直接用self调用,不能调用属性,只能调用方法.
代码体现

#import <Foundation/Foundation.h>
//父类
@interface Person : NSObject{
    char *_name;//姓名
    double _high;//身高
    double _weight;//体重
}
-(void)run;
-(void)setName:(char *)name;
+(void)eat;
@end
@implementation Person
-(void)run{
    NSLog(@"父类的方法...跑....");
}
-(void)setName:(char *)name{
    _name=name;
}
+(void)eat{
    NSLog(@"父类的...吃....");
}
@end
//子类警察
@interface Police : Person{
    char *_qiang;
}

-(void)run;
+(void)catchThief;
@end

@implementation Police

//重写了:对象会调用子类自已的同名方法
-(void)run{
    NSLog(@"子类...警察拿着枪跑....");
    [super run];//代表调用父类的同名方法.
   // [super eat];错误的,不能在对象方法中调用父类的类方法
   }

+(void)catchThief{
    NSLog(@"抓小偷...");
    //[super eat];//如果子类没有重写父类的方法,没有必要用super.
    [self eat];
}
@end
int main(){
   Police *p =[Police new];
    [p run];
    //[Police catchThief];
}

关于super的一些思考
1.super是调用父类的方法的关键字,所以类的继承是使用super的前提.
2.属性不能用super.因为子类不能重写父类的属性.
3.super在类方法中代表是一个类,在对象方法中代表的是一个对象,这一点与self是一致的.

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值