书上例子 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指向对象的属性。