2015-05-23 2 views
0

Я просто не понимаю, почему t.getName() is Keen, если t присваивается u.Не понимаю ссылок

public class StringProgram{ 
    public static void main(String[] args) { 


    Person t = new Person("Gene"); 
    Person u = t; 
    u.setName("Keen"); 

    System.out.println(t.getName());//Keen 
    System.out.println(t.equals(u));//true 


    } 
} 

Person класс

public class Person{ 
    private String name; 

    public Person(String d){ 
    name=d; 
    } 
    public void setName(String a){ 
     name=a; 
    } 

    public String getName(){ 
     return name; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (!(o instanceof Person)) { 
      return false; 
     } 

     return ((Person) o).name.equals(this.name); 
    } 
} 

ответ

1

Это так же, как user4932934 упоминалось в свой комментарий выше. Обратите внимание, что строка:

Person t = new Person("Gene"); 

использует «новый» ключевое слово - это говорит о том, что создается новый объект. Line:

Person u = t; 

просто присваивает "т" на "и". Теперь они ссылаются на один и тот же объект в памяти, новый экземпляр Person не создается.

1

Person u = t; делает u относится к тому же объекту, что и t. Это же место памяти, если это помогает. Поэтому изменение содержимого t также изменяет содержимое u. Потому что они одни и те же.

2

Я тоже немного новый, но я думаю, поэтому он напечатает «Keen». Это займет набег на использование объекта java

Прежде всего, создает объект человека, который имеет переменную имени «Gene». Затем для ссылки на объект используется ссылка в вашем случае t. Таким образом, t всегда будет ссылаться на этот объект Person.

Затем, с вашей следующей строкой, Person u=t, вы создаете новую ссылку, которая на самом деле ссылается на тот же объект Person с «Gene» в качестве оригинальной ссылки t. Используя знак =, они сделали то же самое, см. «Джин», точно так же, как равенство с математическими операциями в Java делает левую руку равной правой.

Следовательно, ссылаетесь ли вы на объект «Джин» с u или t, вы имеете в виду то же самое. Следовательно, в u.setName("Keen") или t.setName("Keen") вы достигаете одного и того же объекта где-то в памяти и делаете что-то с ним, в этом случае изменяя переменную name на «Keen».

1

Я поделюсь с вами метафорой относительно ссылок, которые я когда-то читал.

Представьте, что ваш объект Person является воздушным шаром. Ваша ссылка t представляет собой строку (веревку, а не строку java), прикрепленную к воздушному шару.

Итак, когда вы создаете другую ссылку у который такая же, как т, вы создали еще одну строку (веревка), прикрепленную к одному и тому же воздушному шару (Person).

Если вы изменили свойство своего воздушного шара, например. цвет, и u и t увидят это изменение, так как у вас есть только один шар, прикрепленный к u и t.

Поэтому, когда вы назначаете ссылку на другую ссылку, вы не создаете новый объект.