-----------android培训、java培训、iOS培训、.Net培训、期待与您交流!------------
先看一个Java的例子
package com.think.test;
public class Test {
private int number;
public void setNumber(int number){
this.number = number;
}
public void printNumber() {
this.setNumber(5); // < 1 >
System.out.println(this);
System.out.println("The instance variable number of Test class are equal to " + this.number);
}
public static void main(String[] args) {
Test test = new Test();
System.out.println(test);
test.printNumber();
}
}
运行结果:
从中可以看出this是指向对象自身的指针,所以this.number 代表着Test类的成员变量,在setNumber中使用this,是为了避免作为参数传递进setNumber方法的number与成员变量同名而无法区分。而在调用对象方法时,因为已经知道是哪个对象调用了,所以this是可以省略的。
OC中也有类似的关键字,即self,不过self不仅可以指代对象,也可以指代类,取决于调用者
1. self 关键字
//
// main.m
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person *p = [[Person alloc] init];
[p setAge:23];
NSLog(@"%@",p);
NSObject *obj = [Person gym]; // 得到调用类方法的self对象
Class c = [Person class]; // Person类class方法返回类对象
NSLog(@"%@",c);
BOOL b = c == obj ? YES : NO;
NSLog(@"%d",b); // < 2 >
}
return 0;
}
//
// Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
}
// _age的setter与getter
- (void) setAge:(int)age;
- (int) age;
// 人走路
+ (void) walk;
// 人跳跃
+ (void) jump;
// 人做体操
+ (id) gym;
@end
//
// Person.m
#import "Person.h"
@implementation Person
// _age的setter与getter
- (void) setAge:(int)age
{
self->_age = age;
// 输出self
NSLog(@"%@",self);
}
- (int) age
{
return _age;
}
// 人走路
+ (void) walk
{
NSLog(@"走一步");
}
// 人跳跃
+ (void) jump
{
NSLog(@"跳一步");
}
// 人做体操
+ (id) gym
{
// walk一下,jump一下,就做好体操了
[self walk];
[self jump];
// 输出self
NSLog(@"%@",self);
return self;
}
@end
分析:由第一与第二个的输出可以得到Person对象p在响应setAge方法时,此时的self对象就是p,而最后输出的布尔值1,证明了通过class方法得到的该类的类对象与通过调用类方法[Person gym]所返回的self对象相等,此时self是指向该类的类对象。
相关问题1:对象能调用类方法吗?
相关问题2:类能调用对象方法吗?
解答1:在 < 2 > 添加如下代码
[p gym];
Xcode 报错
所以 不能
解答2: 同样在< 2 > 添加如下代码
[Person setAge:23];
Xcode 报错
所以 不能
2. super 关键字
有时候,我们需要调用父类的方法,为了确定到底是要调用父类的,还是子类的,所以使用super关键字来区分,比如在前面的构造init方法中有这样的代码
if (self = [super init])
{
self.gname = gname;
self.category = category;
}
这里就调用了父类(NSObject)的init方法,进行初始化对象的操作,当然,不仅仅是init方法,当子类不是完全替代父类,而是在父类的基础上,再进行一些操作时,也可以使用super关键字。
//
// Student.h
#import "Person.h"
@interface Student : Person
+ (void) gymbetter;
@end
//
// Student.m
#import "Student.h"
@implementation Student
+ (void) gymbetter
{
// [super gym];
[self walk];
[self jump];
[super gym];
}
@end
main.m中< 2 > 添加
[Student gymbetter];
运行结果:
3.类方法
类方法前有 +号 , 调用形式为 [ 类名 方法名],效率比对象方法高,但是不能访问直接成员变量,比如一个计算器类,那么加减乘除的计算方法使用类方法比较合适
4.对象方法
对象方法前有 - 号,调用形式为[ 对象名 方法名], 能直接访问成员变量,但依赖于对象,比如计算器有多个按钮和一个显示屏,通过按钮修改显示屏的方法使用对象方法比较合适
ji