Не понимая Echo e2 = e1 в Java - PullRequest
2 голосов
/ 22 июня 2010

Я понимаю следующие выходные данные 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. и т. Д.

Я надеюсь, что кто-то объяснит это.

Заранее спасибо.

Ответы [ 6 ]

5 голосов
/ 22 июня 2010

Когда у вас есть Echo e2 = e1; вы делаете так, чтобы и e1, и e2 указывали на одну и ту же ячейку памяти. Таким образом, всякий раз, когда вы добавляете к e2, он добавляет к этой ячейке памяти, так что e1 имеет то же значение, и наоборот. В частности

Когда х = 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

Когда х = 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 голосов
/ 22 июня 2010

в переменных Java, которые содержат объекты, действительно являются ссылками, они не содержат фактического значения.поэтому, когда вы пишете e2 = e1, вы устанавливаете ссылку e2 так, чтобы она указывала на тот же объект, что и e1.поэтому, когда вы пишете e2.count = 1, для e1.count устанавливается одинаковое значение, поскольку они являются полями одного и того же объекта.

1 голос
/ 22 июня 2010

Echo e2 = e1 делает e2 ссылкой на тот же объект, что и e1.Таким образом, с тех пор у вас есть один единственный объект за двумя разными ссылками.

1 голос
/ 22 июня 2010

Java-задания все по ссылке. Таким образом, когда вы говорите

Echo e2 = e1;

Вы говорите Сделайте еще одну ссылку, помеченную e2, и укажите на те же данные, что и ссылка, помеченная e1. Затем, когда данные, на которые указывает e1, изменяются, то же самое происходит и с данными, на которые указывает e2, поскольку это те же самые данные .

1 голос
/ 22 июня 2010

После того как вы сделали Echo e2 = e1; e1 и e2 - это один и тот же объект. У вас есть только два дескриптора для доступа к нему, но это одно и то же, и все содержимое одинаково. По сути, у вас есть столько объектов, сколько new операторов, которые вы выполнили

0 голосов
/ 22 июня 2010

Когда вы устанавливаете e1 = e2, вы говорите, что ссылки e1 и e2 указывают на один и тот же объект Echo.Тогда вы должны рассматривать e1.count и e2.count как одно и то же значение.Таким образом, это идет 0 -> 1 -> 2 -> 4 -> 5 -> 10 .. и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...