黑马程序员——入学Blog03----OC的self,super,类方法与对象方法

来源:互联网 发布:淘宝美工的岗位要求 编辑:程序博客网 时间:2024/05/16 12:39

-----------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




0 0
原创粉丝点击