黑马程序员_类方法
<一>、类方法的基本基本使用
1.基本概念
直接可以用类名指向那个的方法(类本身会在内存中占据存储空间,里面有类、对象方法列表)
2.类方法和对象方法对比
1) 对象方法
* 以减号开头
* 只能让对象调用,没有对象,这个方法根本不可能被执行
* 对象方法能访问实例变量(成员变量)
类方法程序示例:
@import <Foundation/Foundation.h>
@interface Person : NSObject
// 类方法都是以加号+开头
+ (void)printClassName;
@end
@implementation Person
+ (void)printClassName
{
NSLog (@"这个类叫做Person");
}
@end
int main()
{
[Person printClassName];
// Person *p = [Person new];
// [p test];
return 0;
}
<二> 类方法与对象方法的区别
一、对象方法
1.减号 - 开头
2.只能由对象来调用
3.对象方法中能访问当前对象的成员变量(实例变量)
二、类方法
1.加号 + 开头
2.只能由类(名)来调用
3.类方法中不能访问成员变量(实例变量)
类方法的好处和使用场合:
1.不依赖于对象,执行效率高
2.能用类方法,尽量用类方法
3.场合:当方法内部不需要使用到成员变量时,就可以改为类方法
可以允许类方法和对象方法同名
@import <Foundation/Foundation.h>
@interface Person : NSObject
{
int age;
}
// 类方法都是以加号+开头
+ (void)printClassName;
- (void)test;
+ (void)test; // 类方法和对象方法可以重名,原因是类型不同。
@end
@implementation Person
+ (void)printClassName
{
NSLog (@"这个类叫做Person-%d", age); // 错误写法;类方法不依赖于对象。
// 编译报错:error:instance variable 'age' accessed in class method
// 实例变量age不能在类方法中访问
}
- (void)test
{
NSLog (@"调用了对象方法test-%d", age);
// [Person test]; // 对象方法中可以调用类方法
}
+ (void)test
{
NSLog (@"调用了类方法test"):
// [Person test]; // 无限循环
}
@end
int main()
{
[Person test]; // 找加号+开头的类方法
Person *p = [Person new];
[p test]; // 找减号-开头的对象方法
/*
[Person test]; // 错误写法:对象方法只能由对象调用。
运行报错:+[Person test]: unrecognized selector sent to instance ...
*/
// [Person printClassName];
// Person *p = [Person new];
/*
[p printClassName]; // 错误写法;类方法只能由类来调用。
运行报错:-[Person printClassName]: unrecognized selector sent to instance ...
系统会认为现在调用的printClassName是个对象方法
*/
return 0;
}
<三> 类方法练习
/*
设计一个计算器类
* 求和
* 求平均值
*/
#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
{
int sum = [JiSuanQi sumOfNum1: num1 andNum2: num2];
return sum / 2;
}
@end
int main()
{
// JiSuanQi *jsq = [JiSuanQi new];
// [jsq sumOfNum1: 10 andNum2: 13];
[JiSuanQi sumOfNum1: 10 andNum2: 13];
[JiSuanQi averageOfNum1: 10 andNum2: 12];
return 0;
}