不了解Java中的Echo e2 = e1

时间:2010-06-22 14:19:11

标签: java

我理解以下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。

我希望有人解释它。

提前致谢。

6 个答案:

答案 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)

保存对象的Java变量中的

实际上是引用,它们不包含实际值。所以当你写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时,您说的是引用e1e2指向同一个Echo对象。那么您应该将e1.counte2.count视为相同的值。所以它变为0 - &gt; 1 - &gt; 2 - &gt; 4 - &gt; 5 - &gt; 10 ..等等。