2013-12-19 96 views
0

我想了解一些可能非常簡單的東西,所以我很抱歉如果我看起來像一個菜鳥。Java:對象字段賦值

我有這樣的java類:

public class Student { 
    public String name = ""; 
    public int age = 0; 
    public String major = "Undeclared"; 
    public boolean fulltime = true; 

    public void display() { 
     System.out.println("Name: " + name + " Major: " + major); 
    } 

    public boolean isFullTime() { 
     return fulltime; 
    } 
} 

這個類從我所說的第一種:

public class TestStudent { 
    public static void main(String[] args) { 
     Student bob = new Student(); 
     Student jian = new Student(); 
     bob.name = "Bob"; 
     bob.age = 19; 
     jian = bob; 
     jian.name = "Jian"; 
     System.out.println("Bob s Name: " + bob.name); 
    } 
} 

這將打印:

鮑勃姓名:健

我很好奇這些任務是如何完成的。

+0

原因'bob'和'jian'指的是同一個對象。 –

+0

謝謝大家的回答,我把所有的答案都提了出來,因爲他們是對的。我選擇了@ AnthonyGrist的回答,因爲它更清晰。再次感謝! –

回答

2

當你做Student bob = new Student()正在創建的學生類的一個實例,並在bob變量在內存中保存到該位置的引用。

當你做jian = bob,您節省了參考同在jian變量的存儲位置,所以現在jianbob完全Student類的同一個實例。

3

此行導致jianbob指向相同對象:

jian = bob; 

因此改變jian名稱也將改變bob名。

jian.name = "Jian"; 
2
Student bob = new Student(); 
Student jian = new Student(); 
// you've created two objects and two references 
bob.name = "Bob"; // bob's name is now Bob 
bob.age = 19; // bob's age is now 19 
jian = bob; // the jian reference is now referring to the same object as bob 
jian.name = "Jian"; // jian and bob are now referring to an object whose name is changed to Jian 
System.out.println("Bob s Name: " + bob.name); 
2

Jian參照bob對象。

2

您正在將bob的參考文件複製到jian。

現在都指向相同的對象。

2

Assignement這是由於線路

jian = bob; 

這一行,您可以通過鮑勃的對象替換堅的對象的實例。 這意味着Jian實例成爲Bob實例,但Bob實例保持存在。

所以,當你改變健的名字,在內部你改變鮑勃

1

的名稱之前所著,你的變量鮑勃和劍是鏈接到內存中的同一個對象。也就是說,當你使用=運算符複製鏈接時,對於不是基元類型。如果您需要創建包含先前輸入數據的字段的anoter對象,則需要實現克隆方法。或者你可以添加構造函數,讓你的對象參數化並複製你的領域。 實施例:

jian = bob.clone(); 

About this on wikipedia

通過構造:

public Student(Strudent obj){ 
    this.name = obj.name; 
    this.age = obj.age; 
} 

在主: 學生建=新學生(BOB);

你可以找到解決你的問題的許多變種。使用你喜歡的任何變體。

+0

非常感謝你,這是一個很好的答案,我upvoted它 –