java中的传值与传reference
class Number {
int i;
}
public class Assignment {
public static void main(String[] args) {
Number n1 = new Number();
Number n2 = new Number();
n1.i = 9;
n2.i = 47;
System.out.println( "1: n1.i= " + n1.i + ", n2.i= " + n2.i);
n1 = n2;
System.out.println( "2: n1.i= " + n1.i + ", n2.i= " + n2.i);
n1.i = 27;
System.out.println( "3: n1.i= " + n1.i + ", n2.i= " + n2.i);
}
}
这段代码输出的结果是什么?最后一个输出语句为什么输出这种情况,请大家亲自操作一下再来回答,谢谢
------解决方案--------------------n1 = n2; 传的是引用。
实例化对象时,对象和属性的值放到不同的内存空间。
n1.i = 27; 这样值都变为27了。
------解决方案--------------------1: n1.i= 9, n2.i= 47
2: n1.i= 47, n2.i= 47
3: n1.i= 27, n2.i= 27
Java中,都是传值调用,而不是传址调用,
n1 = n2;
表示,n1指向了n2对象的引用, 就是n1,n2指向内存中同一个实体,
既一个类创建的两个对象,如果具有相同的引用,那么就具有完全相同的实体,
------解决方案--------------------n1 = n2;
后引用n1, n2都指向同一个对象了, 所以修改引用n1指向的对象, 结果就是一样的了
楼主需要理解引用和对象之间的区别, new的对象一般在堆里面, 而引用是放在栈里面, 相当于编译原理里面的符号表, 指向创建的对象
------解决方案--------------------n1 = n2;
执行后,n1,n2都指向原来n2指向的对象。
n1.i = 27;
执行后,n1,n2的内容都修改,因为它们本来就已经指向同一个对象了。
所以输出结果都应该是27。
------解决方案--------------------看来我来晚了。