很难理解参考类型的工作原理

时间:2012-04-30 18:08:25

标签: java oop object

我很遗憾提出这样一个基本问题,但我不明白这个输出是如何产生的。如果有人有时间回答我的愚蠢问题,我将非常感激。谢谢。

这是代码

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.outprintln(e2.count);  
    }
}  

class Echo {  
    int count =0;  
    void hello() {   
        System.outprintln("helloo...");   
    }  
}

这给出了输出:

helloo...

helloo...

helloo...

helloo...

10 

现在得到24而不是10我们宣布Echo e2 = e1;而不是Echo e2 = new Echo; 我想知道这是如何生成这个特定的输出。对于10我可以逐字地将值放在每个中并得到答案但是当我使它们相等时会发生什么(我无法理解)。

2 个答案:

答案 0 :(得分:11)

当你e2 = e1时,它使e1也指向同一个对象。

因此,当e1e2递增时,计数会增加两倍。

执行Echo e2 = new Echo()Echo e1 = new Echo()时,e1和e2都指向两个不同的对象,因此增加count的e1不会对e2.count产生任何影响。

编辑:

我会添加一张图片来解释相同的内容。

enter image description here

答案 1 :(得分:2)

当您使用关键字“new”时,您将创建一个新对象。

例如,以下内容创建了不同的对象

Echo e1= new Echo();
Echo e2 new Echo();

两个对象彼此独立,

但是,如果你这样做

Echo e1= new Echo();
Echo e2= e1;

e1和e2都引用同一个对象,你对e2所做的每一次操作也会影响e1,反之亦然,因为它们指的是同一个新的Echo()。

但是,请考虑以下事项:

Echo e1= new Echo();
Echo e2= e1;
e2 = new Echo();

这会破坏e1吗?答案是不。 e2停止引用e1,而是引用一个新对象(因此是关键字)。

也许这不能直接回答你的问题,但应该澄清几点。