2011-12-29 61 views
3

我可能只是無法正確的單詞谷歌,但我無法找到以下問題的答案。Java集實例的超級實例

是否可以顯式設置新類實例的超類。例如。我有一個SuperClazz實例,並且想要創建一個Clazz的新實例,它擴展了SuperClazz。我可以做這樣的事情(代碼正是我想要做的,它不會編譯和不正確):

class Clazz extends SuperClazz{ 

Clazz(SuperClazz superInstance){ 
    this.super = superInstance; 
} 
} 
+0

'this.super'不會是一個類,而是一個實例。並且沒有'superinstance'這樣的事情,因爲super就是實例本身。 – Howard 2011-12-29 11:55:52

+3

也許你可以改述你的問題,並詢問你想用這種結構解決你面臨的「真實世界」問題。 – Howard 2011-12-29 11:57:15

+1

不,你不能。 – 2011-12-29 11:58:40

回答

3

超類總是隱式實例化,所以你不能做到這一點— 「擴展」類中的「超級類」。你可能想要的是一個拷貝構造函數。

+0

是的,我想要一種方法來使用複製構造器。 – 2011-12-29 12:13:15

6

你在混合繼承和委派。當一個對象調用

super.doThis(); 

它不具有對象的超類的類型另一個對象調用doThis。它自己調用它。 thissuper是同樣的事情。 super只允許訪問在超類中定義的方法的版本,並在子類中重寫。所以,改變超級實例沒有意義:沒有超級實例。

1

我認爲你有一些意思或你正在使用的術語的誤解。

實例(或對象)是您在運行時使用new Clazz()創建的內容。你不能改變它(除非你使用字節碼修改技巧)。 你真正想要的是創建2個類:基類和它的子類。這是最簡單的例子。

class SuperClazz { 
} 

class Clazz extends SuperClazz { 
} 

如果你想從子類中使用的構造函數中調用父類的構造函數exlplitly super(): 類clazz中擴展SuperClazz { 公共clazz中(){ 超(); } }

+0

不,我想我正在使用正確的術語。問題是java看起來並沒有超級實例的概念。我最近在JS中處理原型實例,所以我通過Java可能會將超類的實例與子類的實例分開,但事實並非如此? (是的,我知道JS和Java是兩個不同的東西,我只是雖然這個特定的方面有一些來自Java ...) – 2011-12-29 12:10:49