黑马程序猿_OC之类方法与对象方法、self与super

前面大概总结过类方法与对象方法,但是说的不详细,也没有那具体的代码来记录问题,这里再具体对比一下类方法与对象方法,也把self跟super关键字的不同做一下对比。

1.类方法与对象方法

先说一下类方法与对象方法的相同点:

都是声明在类里面的方法,在内存中都是在类的存储空间里面。

不同点:类方法都是以+开头,只能由类来调用(类存储空间里面只有方法,对象存储空间里面才有成员变量),而且不能访问成员变量  调用类方法可以不用创建对象,

                对象方法都是以 - 号开头,只能由对象来调用,对象方法中能访问当前对象的成员变量

使用类方法有什么好处呢?类方法的好处就是不依赖于对象,因为调用类方法可以不用创建对象,所以执行效率高。当方法内部不需要使用到成员变量时就改为类方法,类方法可以与对象方法同名。下面一段代码对比一下两者的区别:

#import<Foundation/Foundation.h>

@interface Person:NSObject
+ (void)printClassName;  // 声明了三个方法,一个类方法,两个对象方法
- (void)printClassName;
- (void)test;
@end

@implementation Person

+ (void)printClassName
{
NSLog(@"调用类方法");
}

- (void)printClassName
{
NSLog(@"调用对象方法");
}

- (void)test
{
  NSLog(@"调用test方法");  
  [Person printClassName];  // 对象方法test里面又再调用了类方法printClassName
}

@end

int main()
{ 
   Person *p = [Person new];
   [p printClassName];  // 此处调用了对象方法printClassName,输出“调用对象方法”

   [Person printClassName];  //此处调用了类方法printClassName,输出“调用类方法”,而且没有创建对象哦
   [p test];   // 此处调用了对象方法test,输出的内容为“调用test方法,调用类方法”
   return 0;
}

此段代码中如果写[Person test]编译的时候会警告,链接的时候会报错:找不到test类方法。

2.关键字self与super

self是指针变量,指向了方法调用者:谁调用这个方法,self就指向谁。self主要有两个作用:

1.在对象方法中利用“self->成员变量”访问当前对象内部的成员变量

2.利用[self 方法名]可以调用其他对象方法或者类方法:self出现在对象方法中,self就代表对象,self出现在类方法中,self就代表类

#import <Foundaton/Foundation.h>

@interface Student:NSObject
{
  int _score;
}
- (void)setScore:(int)score;   // 封装 setter
- (int)score;    // getter
- (void)test;
+ (void)test;
- (void)test1;
+ (void)test1;
@end

@implementation Student

- (void)setScore:(int)score
{
   _score = score;
}
- (int)score
{
    return _score;
}
- (void)test
{
 int _score = 20;
 NSLog(@"test分数为%d",self->_score); // self的第一个作用,访问当前对象内部的成员变量
}
+ (void)test
{
 NSLog(@"调用类test方法");
}
- (void)test1
{
  [self test];   // self的第二个作用,调用其他对象方法,此处调用test对象方法
}
+ (void)test1
{
  [self test];  // self的第二个作用,调用其他类方法,此处调用test类方法
}

@end


int main()
{
 Student *s = [Student new];
 [s setScore:70];
 int s = [s score];
 NSLog(@"分数为%d",s); // 此处输出结果为“分数为70”
 [s test]; // 此处输出结果为“test分数为70” 不要受int _score = 20 ;的影响,self->_score指向的是当前对象的成员变量,而不是一般int 变量
 [Student test];  
 [Student test1]; //此处输出结果为“调用类test方法” 
 [s test1];   // 此处输出结果为“test分数为70”
 
 return 0;
}

类方法跟对象方法里面都不可以使用self去调用彼此的方法,只能调用同类的方法

super关键字的作用:
1.直接调用父类中的某一个方法(所以super是在继承的条件下使用的)
2.super处在对象方法中,则调用父类的对象方法
   super处在类方法中,则调用父类的类方法
super关键字的使用场合:子类重写父类的方法时想保留父类的一些行为

#import<Foundation/Foundation.h>
@interface Animal:NSObject
- (void)walk;
- (void)run;
+ (void)run;
@end

@implementation Animal
- (void)walk
{
 NSLog(@"动物在走");
}
- (void)run
{
 NSLog(@"-动物在跑");
}
+ (void)run
{
NSLog(@"+动物在跑");
}
@end

@interface Dog:Animal
@end

@implementation Dog
- (void)walk
{
 NSLog(@"狗在走"); 
 [super walk];  // 此处子类要重写父类的walk方法,同时调用父类的walk对象方法
}

+ (void)run
{
NSLog(@"狗在跑");
[super run];  // 此处也是子类要重写父类的run方法,同时调用父类的run类方法
}
@end

int main()
{
 Dog *d = [Dog new];
 [d walk];  // 此处输出结果为“狗在走,动物在走”
 [Dog run];  // 此处输出结果为“狗在跑,+动物在跑”
 return 0;
}
同样地,类方法跟对象方法里面都不可以使用super去调用父类的彼此的方法,只能调用父类的同类的方法




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值