A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 葬花桥 中级黑马   /  2014-4-30 11:27  /  1730 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 葬花桥 于 2014-5-4 08:20 编辑

前面问过isa指针,知道了它是每个对象中指向类的指针,在调用对象方法时,通过它去寻找类中的对象方法。后来学习了self指针,感觉它和this指针差不多,指向调用方法的对象本身,我是不是可以拿它当this指针用,又或者它们还是有区别?

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

3 个回复

正序浏览
Freedam 发表于 2014-5-2 20:11
oc中的self和java中的this还是有区别的:
oc中的self可以用在动态方法也可以用在静态方法,
而java中的this ...

这个我后来也看到老师讲到了,谢谢这么仔细的回答
回复 使用道具 举报
oc中的self和java中的this还是有区别的:
oc中的self可以用在动态方法也可以用在静态方法,
而java中的this只能用在动态方法中。
例如:
oc中
main.m
  1. #import <Foundation/Foundation.h>
  2. #import "student.h"

  3. int main(int argc, const char * argv[])
  4. {

  5.     int a;
  6.     student *stu = [student new];
  7.    
  8.     [stu setname:@"lsmseed"];
  9.     NSLog(@"%@",stu->name);
  10.    
  11.     a = [stu getnum];
  12.     NSLog(@"%d",stu->number);
  13.    
  14.     [student print];
  15.    
  16.     printf("Hello, World!\n");
  17.     return 0;
  18. }
复制代码


student.m
  1. #import "student.h"

  2. @implementation student
  3. - (void) setname:(NSString *)name
  4. {
  5.     self->name = name;
  6.    
  7. }

  8. - (int) getnum
  9. {
  10.     return self->number;
  11. }

  12. + (void) print
  13. {
  14.     NSLog(@"%@",self);
  15. }

  16. @end
复制代码


student.h
  1. #import <Foundation/Foundation.h>

  2. @interface student : NSObject
  3. {
  4.     @public
  5.     int number;
  6.     NSString *name;
  7. }



  8. - (void) setname: (NSString *)name;
  9. - (int) getnum;
  10. + (void) print;

  11. @end
复制代码


运行结果:
2014-05-02 19:51:03.434 self[876:303] lsmseed
2014-05-02 19:51:03.438 self[876:303] 0
2014-05-02 19:51:03.439 self[876:303] student
Hello, World!
Program ended with exit code: 0
代码中student这个类定义了三个方法其中动态方法是setname和getnum,静态方法是print,self在这三个方法中体现了不同的作用,首先在动态方法中self指代调用者的对象就是stu,在静态方法中self指代类student这个类名,在不同的方法中意义不同可以同时用在两种方法中。

java中的this
set.java(动态)
  1. public class student
  2. {
  3.         int number;
  4.         public void setnum(int number)
  5.         {
  6.                 this.number = number;
  7.         }

  8.         public static void main(String[] args)
  9.         {
  10.                   student n = new student(100);
  11.                   System.out.println("num = %d"+n.setnum);
  12.         }
  13. }
复制代码


 运行结果:
num = 100

set.java(静态)
public class student
{
        int number;
        public static void setnum(int number)
        {
                this.number = number;
        }

        public static void main(String[] args)
        {
                  student n = new student(100);
                  System.out.println("num = %d"+n.setnum);
        }
}
编译出错,这也是一个典型错误,静态只能访问静态。
因此this不能用于静态方法中,而self可以。同时this()这种形式也用于java的一些构造函数中,self没有这样的用法,所以在一些应用中this和self还是有较大区别的。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报 1 0
使用的方法是一样的,因为指针其实就是一个地址,不论面向对象和面向过程,地址这个概念是一样的。C++因为有对象的概念,所以也有了指向对象的指针,比如:
Class A{
};
A a;
A *P=&a;
就表示指针P是指向对象a的指针
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马