У меня проблемы с пониманием, как ссылки на объекты работают в Java? - PullRequest
1 голос
/ 27 июня 2019

Изначально я понял, что ссылки - это просто ссылки в памяти, в которых хранится область памяти реального объекта, который они содержат.Однако приведенный ниже код и его вывод меня смущают.Здесь вы можете увидеть реализацию простого класса Man.

Я создаю объект Man в первой строке со ссылкой, называемой peter.Питер сам по себе является просто местом памяти, верно?Таким образом, человек должен просто хранить объект в той области памяти, в которой он находится.

Но когда я назначаю другому человеку ссылку на Питера, а потом меняю имя Питера, человек этого не знает и печатает имя.Как это может быть, поскольку он хранит ссылку на память для Питера?Разве он не должен следить за изменениями, внесенными в него?

public class Testing {

  public static void main(String[] args) {
    Man peter = new Man("brown", 182, 78000, "Peter");
    Man person = peter;
    peter = new Man("brown", 182, 78000, "Leonard");
    System.out.println(person.name);
  }
}

class Man {

   String hairColor;
   int height;
   double salary;
   String name;

   public Man()
   {
     hairColor = "brown";
     height = 180;
     salary = 50500.5;
     name = "John";
   }
   public Man(String hair, int high, double pay, String nam)
   {
        this.height = high;
        this.hairColor = hair;
        this.salary = pay;
        this.name = nam;
   }
}

Ответы [ 7 ]

4 голосов
/ 27 июня 2019

Здесь:

Man peter = new Man("brown", 182, 78000, "Peter");

создает Man объект с именем "Peter".

Man person = peter;

создает другую переменную, "указывающую" на созданный выше объект.

peter = new Man("brown", 182, 78000, "Leonard");

создает другого человека по имени Леонард, а затем переменная peter "указывает" на этот новый, второй объект.

Примечание: person не "точка" до peter. Он указывает на человека «объект» в памяти.

И добавление другого "адреса памяти" в переменную peter не изменяет исходный объект, который вы создали.

1 голос
/ 27 июня 2019

Думайте о ссылках как об адресах памяти. Я надеюсь, что этот пример объясняет:

Man peter = new Man("brown", 182, 78000, "Peter");
// Create a new Man object which is placed in (for example) memory location 100
// Assign 100 to peter


Man person = peter;
// Assign 100 to person (copying it from peter)

peter = new Man("brown", 182, 78000, "Leonard");
// Create a new Man object which is placed in memory location 120
// 120 is assigned to peter

System.out.println(person.name);
// person still contains 100, so this prints out the details of the first object
0 голосов
/ 27 июня 2019

С peter = new Man () создает новую ячейку памяти. Теперь 2 ячейки памяти созданы, скажем, 100 и 200. Неподвижный человек указывает на ячейку памяти peter 100. так что он отображает имя первого конструктора peter.

, если вы хотите отобразить значение nam как Leonardm, добавьте присваивание строки ниже

человек = Петр;

System.out.println (person.name);

0 голосов
/ 27 июня 2019

Вы указываете обоим объектам в одну и ту же память / местоположение, а затем назначаете другую ссылку на 1-й объект, чтобы это не повлияло на старые данные памяти.

0 голосов
/ 27 июня 2019

Когда вы используете

= new Man

Вы создаете новый объект. Итак, Питер смотрит на Человека 1, человек смотрит на нового Человека 2

0 голосов
/ 27 июня 2019
Man peter = new Man("brown", 182, 78000, "Peter");
Man person = peter;
peter = new Man("brown", 182, 78000, "Leonard");

Первая строка присваивает ссылку на объект с именем «Питер», вторая строка присваивает предыдущую ссылку на объект переменной person .

В третьей строке вы создаете новый объект и присваиваете ссылку на него переменной peter , которая является полностью новой ссылкой, а переменная person по-прежнему сохраняет ссылку на предыдущий объект.

Если вы хотите, чтобы имя «Леонард» содержалось в обеих переменных, вместо создания нового объекта вы могли бы просто указать в третьей строке

person.name = "Leonard";
0 голосов
/ 27 июня 2019

работает так:

Man peter = new Man("brown", 182, 78000, "Peter");

означает, что вы получили новое место в памяти с этими значениями.

Man person = peter;

означает, что у человека тот же указатель на память о Питере.

peter = new Man("brown", 182, 78000, "Leonard");

Вы изменили область указателя на новое место с новыми значениями.

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