2010-06-22 99 views
2

我理解以下Java输出。不理解Echo e2 = e1在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 

但是当我改变回声E2 =新回声() - 回波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.等

我希望有人解释它。

在此先感谢。

回答

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

3

在Java变量中,保存对象实际上是引用,它们不包含实际值。因此当您编写e2 = e1时,您将参考e2设置为指向与e1相同的对象。所以当你写e2.count = 1时,e1.count被设置为相同的值,因为它们是相同对象的字段。

1

做完之后Echo e2 = e1; e1和e2是同一个对象。你只需要两个手柄来访问它,但它是一样的,所有的内容都是一样的。基本上,您拥有尽可能多的对象,您执行的语句数量为new

1

Java分配全部参考。因此,当你说

Echo e2 = e1; 

你是说做标记e2另一个参考,并指向相同的数据标记e1参考。然后,当e1指向的数据发生变化时,由e2指向的数据也会发生变化,因为它与的数据相同。

1

Echo e2 = e1使得e2指的是与e1相同的对象。所以从那以后,你有一个单独的对象在两个不同的引用之后。

0

当您设置e1 = e2您是sa因为参考e1e2指向相同的Echo对象。因此,您应该将e1.counte2.count视为相同的值。所以它变为0→1→2→4→5→10 ......等等。