在方法体内改变形参对象的指向_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 在方法体内改变形参对象的指向

在方法体内改变形参对象的指向

 2011/12/27 9:07:41  ivanf8e62  http://ivanf8e62.iteye.com  我要评论(0)
  • 摘要:用C/C++的同学一定会觉得本来就是如此,但作为一个一直以Java为生的人,却会认为这是不可思议的.当然,依然有N多用Java的同学,可能连这个基础都没搞明白,他们估计以为以下Java代码会改变o的指向,从而让调用方的o对象值发生改变.voidtest(Objecto){o=newMyInt();o.setInt(12);}staticvoidmain(String[]args){MyInto=newMyInt();o.setInt(1);test(o);//会以为test改变了o对象
  • 标签:方法
用C/C++的同学一定会觉得本来就是如此,但作为一个一直以Java为生的人,却会认为这是不可思议的.  当然,依然有N多用Java的同学,可能连这个基础都没搞明白,他们估计以为以下Java代码会改变o的指向,从而让调用方的o对象值发生改变.
 void test(Object o) {
     o = new MyInt();
     o.setInt(12);    
 }
 static void main(String[] args) {

       MyInt  o = new MyInt();
       o.setInt(1);
       test(o); //会以为test改变了o对象, 其实不然.
  }


Objective-C它也是面向对象, 以上类似的代码也一样是无法改变传入的形参对象的指向, 因为它们形参都是原参对象的指针副本, 更改这个指针副本的指向根本不会影响到原有对象的指向.  
那么Objective-C因为是C的超集,它继承了C的指针,以及指针的指针等一系列操作访问内存的能力, 所以它可以实现在一个函数将形参对象改变指向并影响了调用方真实对象的指向. 
void change(MyObject **);
void change(MyObject **prt) {
     [(*prt) release];
     (*prt) = [[MyObject alloc] init];
     (*prt).type = @"Change";
}

int main(void) {
   @autoreleasepool {
         MyObject  *object = [[MyObject alloc] init];
         object.type = @"hello it";
         change(&object);  //通过传入地址,来实现类似于基本类型(int,long)的地址指向的内容的改写.从而达到改变prt的指向
        [object release];
  }
}

发表评论
用户名: 匿名