2010-01-31 95 views
51

爲什麼Java中的abstract類有constructor爲什麼Java中的抽象類有構造函數?

這是什麼構造,因爲我們不能實例化一個abstract類?

有什麼想法?

+1

退房這個問題澄清,http://stackoverflow.com/questions/260666/abstract-class-constructor-in-java –

+0

您需要一種方法來構建子類的抽象類。從技術上講,抽象類上的公共構造函數實際上只是一個受保護的構造函數。 –

回答

70

Java中的構造函數實際上並沒有「建」的對象,它是用來

+4

通常情況下,如果你把構造函數鏈兼顧理論,那麼父類的構造先叫孩子構造函數執行 – Stranger

+0

'現在,如果你有你的抽象類,兩種不同的子類,當你實例化它們自己的構造函數將被調用之前,然後父類的構造將被調用,該領域將是initialized.'你的意思是第一個孩子的類的構造函數會叫什麼名字? :o – UnKnown

+0

每次流這樣的時刻 - '盛大母公司constructor' - >'父constructor' - >'孩子constructor' –

7

因爲另一個類可以擴展它,並且子類需要調用超類的構造函數。當它的具體子類將被實例化

9

所有包括抽象類可以有constructors.Abstract類構造函數的類會被調用初始化字段。

想象你的抽象類有字段x和y,並且你總是希望它們以某種方式初始化,而不管最終創建了什麼實際的具體子類。所以你創建一個構造函數並初始化這些字段。

現在,如果你有你的抽象類,兩種不同的子類,當你實例化它們自己的構造函數將被調用,然後父類的構造將被調用,字段將被初始化。

如果您不做任何事情,父項的默認構造函數將被調用。但是,您可以使用super關鍵字在父類上調用特定的構造函數。

1

實施明智的你經常會裏面的超級看到在子類的構造函數()語句,像:

 

public class A extends AbstractB{ 

    public A(...){ 
    super(String constructorArgForB, ...); 
    ... 
    } 
} 

 
4

因爲抽象類有狀態(場),他們需要以某種方式初始化somethimes。

7

兩個原因:

1)抽象類具有constructors當一個具體子類實例化的構造函數總是被調用。我們知道,當我們要實例化一個類時,我們總是使用該類的構造函數。現在,每個構造函數都會調用超類的構造函數,並隱式調用super()

2)我們知道構造函數也用於初始化類的字段。我們也知道抽象類可能包含字段,有時候他們需要使用構造函數以某種方式初始化

+0

Debmalya達斯(SCJP&SCWCD) – Debmalya

2

我想這個問題的根源在於,人們認爲,一個構造函數的調用創建的對象。事實並非如此。 Java無處宣稱構造函數調用會創建一個對象。它只是做我們想要構造函數做的事情,比如初始化一些字段......就這些。所以被調用的抽象類的構造函數並不意味着它的對象被創建。