黑马程序员——类方法和关键字self

来源:互联网 发布:mac系统迁移到ssd 编辑:程序博客网 时间:2024/05/16 07:35

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


首先了解下方法的声明和实现:

设计一个计算器类:

只有方法:

1、返回PI  

2、 计算某个整数的平方  

3、计算两个整数的和

#import <Foundation/Foundation.h>@interface JiSuanQi : NSObiect//  方法名叫pi- (double)pi;//  方法名叫pingfang:冒号也是方法名的一部分- (int)pingfang:(int)num;  
// oc方法中一个参数对应一个冒号// - (int)sum:(int)num1 :(int)num2; 这样写可以  但一般不这样写,一般写成下面的可读性好- (int)sumWithNum1:(int)num1 andNum2:(int)num2;  //方法名 sumWithNum1:andNum2:@end@implementation JiSuanQi- (double)pi{  return 3.14;}- (int)pingfang:(int)num{  return num * num;}
// - (int)sum:(int)num1 :(int)num2   这样写可以  但一般不这样写- (int)sumWithNum1:(int)num1 andNum2:(int)num2{  return num1 + num2;}@endint main(){JiSuanQi *j = [JiSuanQi  new];  double a = [j  pi];int b = [j  pingfang:10];  // int c = [j  sum:10 :5];  这样可读性差int c = [j  sumWithNum1:10  andNum2:5];     // 写长一点 可读性好  NSLog(@"%f", a);NSLog(@"%d", b);NSLog(@"%d", c);  return 0;}


方法设计练习:设计一个车类型,和其他车比较车速,返回车速车差距

#import <Foundation/Foundation.h>@interface Car : NSObiect{   @public  int speed;}- (int)compareSpeedWithOther: (Car *)other;@end@implementation Car- (int)compareSpeedWithOther: (Car *)other{   return speed – other->speed;}@endint main(){   Car *c1 = [Car new];c1->speed = 200;Car *c2 = [Car new];c2->speed = 150;int a = [c1 compareSpeedWithOther:c2];<span style="white-space:pre"></span>
// 也可以反过来调用[c2 compareSpeedWithOther:c1];NSLog(@"车速差距是%d", a);return 0;}

还有匿名对象:

#import <Foundation/Foundation.h>@interface Car : NSObiect{   @public  int speed;}- (void)run;@end@implementation Car - (void)run{  NSLog(@"车速是%d", speed);}@endint main(){    /*Car *c = [Car new];c->speed = 300;  */
[Car new]->speed = 300;    //匿名对象不要写匿名对象的写法,浪费内存,能看懂就行  [[Car new] run];    <span style="white-space:pre"></span>// 运行后速度0 因为每次创建新对象[Car new]都重新分配空间。不合理return 0;}


类方法:

类方法以“+”开头

对象方法:以“-”号开头。 只能由对象调用。能访问成员变量

类方法: 以“+”号开头 。只能由类调用。类方法不能用对象的成员变量

类方法好处 :不依赖于对象,执行效率高。能用类方法就用类方法。当方法内部不适用成员变量时用类方法,可以允许类方法和对象方法同名

#import <Foundation/Foundation.h>@interface Person : NSObject+ (void)printClassName;@end@implementation Person+ (void)printClassName{   NSLog(@"这个类叫做Person");}@endint main(){  [Person printClassName];    // 类方法调用return 0;}

类方法练习:创建计算器类 ,求和 求平均值

工具类:基本没有任何成员变量,里面的方法基本都是类方法

#import <Foundation/Foundation.h>@interface JiSuanQi : NSObject+ (int)sumWithNum1:(int)num1 andNum2:(int)num2;+ (int)averageWithNum1:(int)num1 andNum2:(int)num2;@end
@implementation JiSuanQi+ (int)sumWithNum1:(int)num1 andNum2:(int)num2{    return num1 + num2;}+ (int)averageWithNum1:(int)num1 andNum2:(int)num2{  int sum = [JiSuanQi  sumWithNum1:num1 andNum2:num2]; /* 类方法调用类方法:封装                                                        对象方法也可以调用类方法  */   
return sum / 2;}@endint main(){   int a = [JiSuanQi  sumWithNum1:num1 andNum2:num2];NSLog(@"两个数的和是%d", a);return 0;}


关键字:self (是一个不以@开头的关键字)

self的使用注意:在类方法中使用就指向类, 在对象方法中使用就指向对象,在对象方法中还可以调用成员变量。不能混用


 

#import <Foundation/Foundation.h>@interface Person : NSObject{    int _age;}- (void)setAge:(int)age;- (int)age;- (void)test;@end@implementation Person- (void)setAge:(int)age{   _age = age;  // 也可以写为self->_age;  self是一个指向调用此方法对象的指针}- (int)age{   return _age; // 也可以写为renturn self->_age;}- (void)test{   int _age = 20;  NSLog(@"Person的年龄是%d", self->_age );<span style="white-space:pre"></span>// 如果将self->_age改为_age,输出年龄为20。这就体现self的用法:访问当前对象的成员变量self->_age}@endint main(){   Person *p = [Person new];  [p setAge:10];  // 将_age值改为10   [p test];    // 输出年龄是10岁。  return 0;}/*self的用法2:方法调用者(和新对象的指针一样)[self 方法名]   可以调用其他对像方法和类方法;例如上面计算器的对象也可以这样用self  */
+ (int)averageWithNum1:(int)num1 andNum2:(int)num2{  int sum = [self  sumWithNum1:num1 andNum2:num2];  /*类方法调用类方法:封装                                                   对象方法也可以调用类方法*/   return sum / 2;}

建立狗对象,要求调用跑的时候先发出叫声

#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;}











0 0
原创粉丝点击