2011-09-23 151 views
0

我正在學習Java。使用new初始化一個變量,之後是賦值並僅初始化賦值,是否有區別?

我有一個自定義的類,它有一個屬性:

public class Person{ 
    private String name; 
} 

我有另一個類,在那裏我做:

public class foo{ 
    private Person guy; 

    public void setGuy(Person guy){ 
     this.guy = guy; 
    } 

    public Person getGuy(){ 
     return guy; 
    } 

    void someMethod(){ 
     Person anotherGuy = new Person(); 
     anotherGuy = getGuy(); 
    } 
} 

我很困惑,當我使用getGuy()方法。 我認爲,當我這樣做:

Person anotherGuy = new Person(); 
anotherGuy = getGuy(); 

我創建一個新的對象,它具有相同的值的傢伙。但看起來anotherGuy實際上是一個指向傢伙的指針。 所以

Person anotherGuy = getGuy(); 

和上面的2行,做同樣的事情?我很困惑。另外,如何在內存中創建一個全新的對象?

+0

人anotherGuy =新的Person();應該是「Person anotherGuy = new Person();」 - 這不是你的問題的答案,而是一個建議:) – doNotCheckMyBlog

+0

thanks..corrected! – rgamber

+0

並且返回值意味着方法聲明中的對象,所以public guy getGuy(),應該是public getGuy():)對不起,不是智慧,但它是好的,如果你開始練習代碼約定:) – doNotCheckMyBlog

回答

1

所以

Person anotherGuy = getGuy(); 

和2行以上,做同樣的事情?

不,其他版本先創建一個新的Person()對象,然後丟棄它(這只是浪費內存和處理器週期)。

+0

謝謝大家的解釋。所以在Java中,當我將一個對象分配給另一個對象時,我僅通過引用來完成。要創建一個全新的對象,我將不得不做Object.clone()或其他的東西,對嗎? – rgamber

+0

忘記Object.clone(),它在大多數情況下被破壞(閱讀Joshua Bloch的Effective Java以瞭解更多信息)。您可以使用'new SomeObject()'或工廠方法或複製構造函數(如果可用)創建一個新對象。 –

0

Java變量只能包含原語和引用。 Person是對象的引用。 (您不必使用&像在C可能++,因爲它是唯一的選擇),當你做

Person anotherGuy = new Person(); // create a new object and assign the reference. 
anotherGuy = getGuy(); // change the reference in `anotherGuy` to be the one returned by getGuy(); 
1
Person anotherGuy; 

這是一個Person對象

anotherGuy = new Person(); 
參考

這設置對新Person對象的引用

anotherGuy = getGuy(); 

這設置參考與foo的傢伙相同的參考。

我想「複製」對象則可能想爲Object.clone看看()

0

是的,都做同樣的事情,在這兩個方法調用後,anotherGuy == null

1

雖然人們已經討論過/解釋了您現有代碼的行爲,但爲了做到您想做的事,請使用Java中的clone功能,其中您的Person類將實現Cloneable界面,該界面會要求您實施clone()方法。

clone()方法應該是這樣的:

public Object clone() 
{ 
    Person p = new Person(); 
    p.setName(this.name); 
    // similarly copy any other properties you want 
    return p; 
} 

,然後調用克隆複製你的對象:

Person another = (Person) person.clone();