public class DrumKitTestDrive {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Echo e1 = new Echo();
Echo e2 = new Echo();
// **e2 = e1;**
int x=0;
while( x < 4 ){
e1.hello();
e1.count = e1.count + 1;
if(x==3){
e2.count = e2.count + 1;
}
if(x>0){
e2.count = e2.count + e1.count;
}
x = x + 1;
}
System.out.print(e2.count);
}
}
class Echo {
int count = 0;
void hello(){
System.out.println("Hellooooo....");
}
}
此代码的输出将为:
Hellooooo....
Hellooooo....
Hellooooo....
Hellooooo....
10
但是,如果我在运行代码时从// e2= e1;
删除评论,系统将打印 24 而不是 10 。我不明白为什么会这样?
据我所知,系统只会将e1
实例的值复制到e2
实例中。如果系统会这样做,结果将保持不变,因为两个对象属于同一类。
答案 0 :(得分:18)
据我所知,系统只会将e1实例的值复制到e2实例中。
不,当你e2 = e1
复制对象引用时 - 你没有复制对象 - 所以变量e1
和{{ 1}}都会指向同一个对象。
所以当你做增量时,它们都会递增相同的计数字段。
仅在没有赋值e2
的情况下,增量发生在两个不同的实例上。
答案 1 :(得分:5)
这是Java的基本原则之一。每个变量只是某个对象的句柄。执行
e1=e2
不会复制对象的值,它会将handles
指向已创建的第二个对象。您实例化的第一个Echo
对象现在根本没有被引用,并且在下次gc运行时将被垃圾收集。
答案 2 :(得分:4)
将一个对象分配给另一个对象只是指定对象引用(指针或多或少)。它不会复制成员变量等。
您需要了解cloning。从维基的第一段开始,用于Java clone()
:
在Java中,对象通过引用变量进行操作,并且 没有用于复制对象的操作符 - 赋值运算符 复制引用,而不是对象。 clone()方法提供 这个缺失的功能。
答案 3 :(得分:0)
尝试为方法Echo创建构造函数,并使用另一个对象作为参数。 并将参数对象的值分配给该对象。 即 '''
Echo(Echo echo){
this.var = echo.var;
}
'''