我理解以下Java输出。
public class EchoTestDrive {
public static void main(String[] args){
Echo e1 = new Echo();
Echo e2 = new Echo();
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.println("e1.count is " + e1.count);
System.out.println("e2.count is " + e2.count);
}
System.out.println(e2.count);
}
}
class Echo {
int count = 0;
void hello (){
System.out.println ("helloooooooo..");
}
}
输出
helloooooooo..
e1.count is 1
e2.count is 0
helloooooooo..
e1.count is 2
e2.count is 2
helloooooooo..
e1.count is 3
e2.count is 5
helloooooooo..
e1.count is 4
e2.count is 10
10
然而,当我将Echo e2 = new Echo()更改为Echo e2 = e1时,我不明白为什么输出是这样的。
public class EchoTestDrive {
public static void main(String[] args){
Echo e1 = new Echo();
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.println("e1.count is " + e1.count);
System.out.println("e2.count is " + e2.count);
}
System.out.println(e2.count);
}
}
class Echo {
int count = 0;
void hello (){
System.out.println ("helloooooooo..");
}
}
输出
helloooooooo..
e1.count is 1
e2.count is 1
helloooooooo..
e1.count is 4
e2.count is 4
helloooooooo..
e1.count is 10
e2.count is 10
helloooooooo..
e1.count is 24
e2.count is 24
24
当x = 0时,e1.count为1,e2.count为0。 当x = 1时,e1.count为e1.count为2,e2.count为2. etc。
我希望有人解释它。
提前致谢。
答案 0 :(得分:5)
当你有Echo e2 = e1时;你这样做,所以e1和e2都指向相同的内存位置。因此,无论何时添加到e2,它都会添加到该内存位置,因此e1具有相同的值,反之亦然。具体地
当x = 0时
e1.hello();
e1.count = e1.count + 1; //adds 1 to the memory location
if (x==3){ // x is 0 so doesn't go in
e2.count = e2.count +1;
}
if(x>0){ // x is 0 so doesn't go in
e2.count = e2.count + e1.count;
}
x = x+1;
System.out.println("e1.count is " + e1.count);
System.out.println("e2.count is " + e2.count);
}
System.out.println(e2.count);
}
因此,存储器位置等于1,并且e1和e2都是1
当x = 1
时e1.hello();
e1.count = e1.count + 1;
//adds 1 to the memory location which was already 1 from last time and now equals 2
if (x==3){ // x is 1 so doesn't go in
e2.count = e2.count +1;
}
if(x>0){ // x is 1 so goes in as 1 is greater than 0
e2.count = e2.count + e1.count; // adds e2 and e1 = 2 + 2 from previous line above = 4
}
x = x+1;
System.out.println("e1.count is " + e1.count);
System.out.println("e2.count is " + e2.count);
}
System.out.println(e2.count);
}
因此,存储器位置等于4,并且e1和e2都是4
答案 1 :(得分:3)
实际上是引用,它们不包含实际值。所以当你写e2 = e1
时,你设置引用e2
指向e1
所做的同一个对象。所以当你写e2.count = 1
时,e1.count
被设置为相同的值,因为它们是同一个对象的字段。
答案 2 :(得分:1)
你做Echo e2 = e1;
之后e1和e2是同一个对象。你只需要两个句柄来访问它,但它是一样的,所有的内容是相同的。基本上,您拥有与已执行的new
个语句一样多的对象
答案 3 :(得分:1)
Java分配都是通过引用。因此,当你说
时Echo e2 = e1;
您说的是另一个标记为e2
的引用,并将其指向与标记为e1
的引用相同的数据。然后,当e1
指向的数据发生变化时,e2
指向的数据也会发生变化,因为它是相同的数据。
答案 4 :(得分:1)
Echo e2 = e1
使e2
引用与e1
相同的对象。因此,从那时起,您在两个不同的引用后面有一个单独的对象。
答案 5 :(得分:0)
当您设置e1 = e2
时,您说的是引用e1
和e2
指向同一个Echo
对象。那么您应该将e1.count
和e2.count
视为相同的值。所以它变为0 - &gt; 1 - &gt; 2 - &gt; 4 - &gt; 5 - &gt; 10 ..等等。