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....");
}
}
Run Code Online (Sandbox Code Playgroud)
此代码的输出将是:
Hellooooo....
Hellooooo....
Hellooooo....
Hellooooo....
10
Run Code Online (Sandbox Code Playgroud)
但是,如果我从// e2= e1;运行代码时删除注释,系统将打印24而不是10.我不明白为什么会这样?
我所理解的是系统只会将e1实例的值复制到e2实例中.如果系统将这样做,结果将保持不变,因为两个对象属于同一类.
pb2*_*b2q 19
据我所知,系统只是将e1实例的值复制到e2实例中.
不,当你e2 = e1你复制对象的引用 -你不使对象的副本-等变量e1,并e2会都指向同一个对象.
因此,当您进行增量时,它们都会递增相同的计数字段.
仅在没有赋值的情况下e2 = e1,增量发生在两个不同的实例上.
这是Java的基本原则之一.每个变量只是某个对象的句柄.执行
e1=e2
Run Code Online (Sandbox Code Playgroud)
不复制对象的值,它指向handles创建的第二个对象.Echo您实例化的第一个对象现在根本没有被引用,并且在下次gc运行时将被垃圾收集.