-2

我想了解这个java代码的输出是如何工作的。请帮忙!我从一本名为 Head First Java 的书中获取了这段代码,代码如下:

public class EchoTestDrive {

    public static void main(String[] args) {
        Echo e1 = new Echo();
        Echo e2 = new Echo(); // the correct answer
        //or
        Echo e2 = e1; // is the bonus answer!
        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(e2.count);
    }
}

class Echo {

    int count = 0;

    void hello() {
        System.out.println("helloooo... ");
    }
}

这是输出:

  %java EchoTestDrive
   helloooo...
   helloooo...
   helloooo...
   helloooo...
   10
4

3 回答 3

2

除了别名,我看不出这个问题可能是关于什么的。如果你有这条线:

Echo e2 = new Echo();

thene2是一个独立的对象,e1并且有自己的count变量。如果你使用这个:

Echo e2 = e1;

那么你总共有一个实例,由和Echo指向。e1e2

其余的只是关于如何以及何时count在循环中更新变量的繁琐细节。

于 2013-01-04T11:31:23.463 回答
2

好....

helloooo...被输出 4 次来自...

    while (x < 4) {
        e1.hello();
        x = x + 1;
    }

至于计数到 10,(假设 Echo e2 = e1;Echo e3 = e1;......

迭代后x = 0:e1.count == 1, e2.count == 0;

迭代后x = 1:e1.count == 2, e2.count == 2;

迭代后x = 2:e1.count == 3, e2.count == 5;

迭代后x = 3:e1.count == 4, e2.count == 10;

尽管这种解释使 e3 完全未被使用。

于 2013-01-04T11:31:54.533 回答
2

该示例就像从源代码池中填空一样。

您已经很好地完成了它,您可能想知道为什么会出现以下差异

Bonus Answer! 
24
correct Answer!
10

在正确的情况下

Echo e2 = new Echo(); // the correct answer 

您正在创建单独的实例,Echo因此它将拥有自己的实例,count并且每次您说e2.count您正在访问此计数时。

在奖励答案案例中

Echo e2 = e1;

你有两个引用指向同一个对象,所以当你这样做时,e2.count你正在访问countfore1e2

于 2013-01-04T11:38:38.763 回答