黑马程序员技术交流社区

标题: OC中的点方法和java中的点方法有什么区别? [打印本页]

作者: 啊康    时间: 2014-4-9 20:39
标题: OC中的点方法和java中的点方法有什么区别?
      各位大神!在OC中对象调用成员变量有好几种方式,其中一种就是点方法,而java中好像更多的是用点方法,那么两种语言中的点方法有什么不同吗?能否请大神详解?给我对比!谢谢!!

作者: 周宇华    时间: 2014-4-9 21:42
oc中的点语法只能调用set方法和get方法,而java可以调用成员方法。
作者: 程浩    时间: 2014-4-9 23:15

点语法:

Person *p =[Person new];

p.age=10;//点语法的本质还是方法调用,不是访问成员变量,自动转换成[p setAge:10];

int a=p.age;//此时自动转化成[p age];

//若直接访问成员变量,OC只有通过->来访问

但是注意:

使用点方法前必须得有setget方法



作者: Freedam    时间: 2014-4-12 01:53
  1. int main()
  2. {
  3. @autoreleasepool {
  4. Student *stu = [[Student alloc] init];

  5. // 设置age的值
  6. stu.age = 10; // 等价于[stu setAge:10];

  7. // 取出age的值
  8. int age = stu.age; // 等价于int age = [stu age];

  9. NSLog(@"age is %i", age);

  10. [stu release];
  11. }
  12. return 0;
  13. }
复制代码
java中的点语法一般用做访问类中的公有成员变量或成员方法。例如:
  1. class Person
  2. {
  3.         int age = 0;
  4.         void setAge(int age)
  5.         {
  6.                 this.age = age;       
  7.         }
  8.         int getAge()
  9.         {
  10.                 return age;
  11.         }
  12.        
  13. }

  14. class demo
  15. {
  16.         public static void main(String[] args)
  17.         {
  18.                 int a = 0;
  19.                                 Person s = new Person();
  20.                 a = s.getAge(); //点语法直接调用类中的方法
  21.                 System.out.println(a);
  22.                 s.setAge(10);
  23.                 a = s.getAge(); //点语法直接调用类中的方法
  24.                 System.out.println(a);
  25.                                 System.out.println(s.age);//点语法直接访问公有变量的值
  26.         }
  27. }
复制代码

OC中的点语法与java的虽然在形式上相同,但是在用法上有着显著地不同。例如:

a.h

  1. #import <Foundation/Foundation.h>
  2. @interface Student : NSObject
  3. {
  4.     int age;
  5. }
  6. - (void)setAge:(int)newAge;
  7. - (int)age;
  8. @end
复制代码


a.m

  1. #import "a.h"

  2. @implementation Student

  3. - (void)setAge:(int)newAge
  4. {
  5.      age = newAge;
  6. }
  7. - (int)age
  8. {
  9.      return age;
  10. }
  11. @end
复制代码


main.m

  1. #import <Foundation/Foundation.h>
  2. #import "a.h"
  3. int main()
  4. {
  5. @autoreleasepool {
  6. Student *stu = [[Student alloc] init];
  7. [stu setAge:10]; //设置age的值
  8. int age = [stu age];//取出age的值
  9. NSLog(@"age is %i", age);
  10. [stu release];
  11. }
  12. return 0;
  13. }
复制代码

这是OC中正常的调用方法用点语法替换之后主函数为:
  1. int main()
  2. {
  3. @autoreleasepool {
  4. Student *stu = [[Student alloc] init];

  5. // 设置age的值
  6. stu.age = 10; // 等价于[stu setAge:10];

  7. // 取出age的值
  8. int age = stu.age; // 等价于int age = [stu age];

  9. NSLog(@"age is %i", age);

  10. [stu release];
  11. }
  12. return 0;
  13. }
复制代码

把原来的[stu setAge:10]替换成了stu.age = 10,把原来的int age = [stu age]替换成了int age = stu.age。因此,OC中点语法的含义跟Java是完全不一样的,OC点语法的本质是方法调用,不是直接访问成员变量。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2