1.问题说明
2.测试用例
int data;
}
该类为作为测试用的类,里面只有一个域。
2.1第一个用例:
public static void main(String[] args) {
AClass a = new AClass();
a.data = 10;
test1(a);
System.out.println(a.data);
}
public static void test1(AClass aClass) {
aClass.data = 0;
}
}
执行过程:
先构造一个新的实例,并为其赋值为10。再调用方法test1(),在该方法中将data的值设为0。然后程序又回到方法体外面,输出结果为0。
在此看来,貌似方法调用时传的是地址,因为对data域的改动影响到了方法体外面。那么再来看下一个例子。
2.2第二个用例:
public static void main(String[] args) {
AClass a = new AClass();
a.data = 10;
test2(a);
System.out.println(a.data);
}
public static void test2(AClass aClass) {
AClass b = new AClass();
b.data = 100;
aClass = b;
}
}
此时同样构造一个新的实例,并将其数据域赋值为10,再调用方法test2()。与方法test1()不同的是,在该方法中又定义了一个新的实例(其值为100),然后使传入的参数指向该实例。该方法执行完毕后,输出的结果为10。看来在方法体中的操作出了方法后就没有作用了,这样的话又不像是在传址了。那是为什么呢?
3.运行过程说明
3.1 对于第一个测试用例
3.2 对于第二个测试用例:
在方法test2()中构造一个新的实例并为其赋值100后,如下图:
经过上图,可以看出:在方法体中传入的引用的拷贝指向确实改变了,它指向了新构造的实例b。但是在方法体外面,原来的实例指向还是没变,所以这回的输出还是10。