2015-05-23 127 views
0

我只是不明白为什么t.getName()是Keen如果t分配给你。不明白引用

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"); 

使用 “new” 关键字 - 它会告诉你创建新对象。 行:

Person u = t; 

简单的 “T” 分配给 “U”。现在他们在内存中引用同一个对象,没有创建Person的新实例。

1

Person u = t;使u表示与t完全相同的对象。相同的内存位置,如果有帮助。所以改变t的内容也会改变u的内容。因为它们是同一个对象。

2

我也有点新,但我认为这就是为什么它会打印出“Keen”。 这将需要进入java对象使用

首先,Person t=new Person("Gene")创建一个名称变量“Gene”的人物对象。然后,它使用一个引用,在您的案例t中引用该对象。因此t将始终引用该Person对象。

然后,用你的下一行,Person u=t,你正在创建实际上指的是同一个Person对象与“基因”的原创t参考一个新的参考。使用=符号使它们做同样的事情,参考“基因”,就像Java中数学操作的平等使左手等于右手一样。

因此,无论您是使用u还是t来引用“基因”对象,您都指的是同样的事情。因此,在u.setName("Keen")t.setName("Keen")中,您正在寻找内存中某处的相同对象,并在其中执行某些操作,在这种情况下,将name变量更改为“Keen”。

1

我会与你分享我曾经阅读的参考资料。

想象一下,您的Person对象是气球。你的引用t是一个连接到气球的字符串(绳索,而不是Java String)。

所以,当你创建另一个参考ü这同样喜欢牛逼,您创建连接到一个相同的气球(人)另一个字符串(绳)。

如果更改了气球的属性,例如颜色,u和t都会看到这个变化,因为你只有一个气球连接到u和t。

因此,当您将引用分配给另一个引用时,您并未创建新对象。