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);
}
} 这段代码输出的结果是什么?最后一个输出语句为什么输出这种情况,请大家亲自操作一下再来回答,谢谢
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.i = 27; 这样值都变为27了。
2: n1.i= 47, n2.i= 47
3: n1.i= 27, n2.i= 27Java中,都是传值调用,而不是传址调用,
n1 = n2;
表示,n1指向了n2对象的引用, 就是n1,n2指向内存中同一个实体,
既一个类创建的两个对象,如果具有相同的引用,那么就具有完全相同的实体,
后引用n1, n2都指向同一个对象了, 所以修改引用n1指向的对象, 结果就是一样的了楼主需要理解引用和对象之间的区别, new的对象一般在堆里面, 而引用是放在栈里面, 相当于编译原理里面的符号表, 指向创建的对象
大家还可以讨论一下HashMap的问题。
执行后,n1,n2都指向原来n2指向的对象。
n1.i = 27;
执行后,n1,n2的内容都修改,因为它们本来就已经指向同一个对象了。
所以输出结果都应该是27。
用implements Cloneable可以实现对象克隆。
int i;
} public class Assignment {
public static void main(String[] args) {
Number n1 = new Number(); // 创建一个实例,下面简称obj1
Number n2 = new Number(); // 创建另一个实例,下面简称obj2
n1.i = 9; // 为obj1实例的属性i赋值9
n2.i = 47; // 为obj2实例的属性i赋值47
System.out.println("1: n1.i= " + n1.i + ", n2.i= " + n2.i);
// 结果:1: n1.i= 9, n2.i= 47
n1 = n2; // 实际含义为将n2的值传递给n1.n2的值为obj2,所以执行后,n1,n2的值都为obj2.
// obj1被废弃.等待gc处理.
System.out.println("2: n1.i= " + n1.i + ", n2.i= " + n2.i);
// 结果:2: n1.i= 47, n2.i= 47
// 很明显,n1.i和n2.i都是obj2.i.所以都是47
n1.i = 27; // 实际上是将47付给obj2.i
System.out.println("3: n1.i= " + n1.i + ", n2.i= " + n2.i);
// 结果:3: n1.i= 27, n2.i= 27
// 同上,n1.i和n2.i都是obj2.i.所以都是27
}
}
-------------------------------------------------------------
有些人以类似以上的例子说明java并非全部值传递.实际上是理解错误.
很明显至少这个例子中全部都是值传递.其他情况不说了.好长......
大家应该能理解.