日期:2014-05-20  浏览次数:20888 次

书上例子 04-18
public class Ex4_20 {
  public static void main(String [] args){
  int i=0;
  MemberVar object1;
  object1=new MemberVar();
  MemberVar object2;
  object2=new MemberVar();
  ParaTransfer o=new ParaTransfer();
  o.changeParameter(i, object1, object2);
  System.out.println(i);
  System.out.println(object1.var);
  System.out.println(object2.var);
  }
}
class MemberVar{
int var=0;
}
class ParaTransfer{
public void changeParameter(int n, MemberVar o1, MemberVar o2){
n=10;
o1.var=10;
o2=new MemberVar();
o2.var=20;
}
}
程序的输出结果是:0
  10
  0
问题:i=0这个可以理解。但是后面的object1.var和object2.var的输出为什么是10和0?
  关于引用变量的调用还是有点弄不明白,请各位高人指点!

------解决方案--------------------
可以这么理解object1,object2这两个是一个指针,java叫引用,object1指向new MemberVar()这个实例
。然后public void changeParameter(int n, MemberVar o1, MemberVar o2){
作为形参 又产生一个引用也是指向刚才new MemberVar()这个实例。主要到这两个引用的地址是不同,只不过他们都是指向同一个实例。o1.var=10;这个是直接修改实例里面的内容,因为object1,o1都指向这个实例,所以是object1.var=10.
o2=new MemberVar();o2这个引用指向了其他引用,但是不会对object1的引用照成影响,object1还是指向那个实例,实例的属性没有被修改,所以object1.var=0;
先抛砖引玉,看楼主这么晚了,还连发两问题,貌似要失眠了。
------解决方案--------------------
这里的两个对象都是引用传递,o1,o2得到的是object1,object2所指向的两个内存地址,o1在方法体内部修改了object1指向的内存地址存在的对象的var值,所以object1在方法外部来获取var的时候,发现改变了。但是o2在方法内部却由于指向了new MemeberVar()这个对象了,所以你改变了var的值,但是外部object2所指向的还是原来的地方,而原来地方的对象并没有改变。至于i就更简单了,因为int是基本类型,所以它属于值传递,你无论怎么改变外部也都不会发生变化
------解决方案--------------------
Java code

public class Ex4_20 {
  public static void main(String [] args){
  MemberVar object1;
  MemberVar object2;
  object1=object2=new MemberVar();
  object1 = null;
  System.out.println(object2==null?"空":"不空");
  object1 = object2;
  object2 = null;
  System.out.println(object1==null?"空":"不空");
  }
}
class MemberVar{
int var=0;
}
//结果是 不空,不空。相信这个能让你对引用的概念有帮助。

------解决方案--------------------
学过C/C++的理解这个问题比较容易。

函数传递只存在值传一种方式,引用类型变量的实质是该类型的指针。o1与main里的object1指向同一内存区域,所以修改o1指向对象的属性会导致object1指向对象的属性改变。

o2=new MemberVar();实质上是修改了形参o2的值。而形参的值不会影响到实参,这时o2与main里的object2指向的是不同的内存区域,所以修改o2指向对象的属性不会影响到object2指向对象的属性。