2011-02-19 114 views
1

如果我有一個抽象類名爲狗與一個構造函數來設置它的權重(雙)和一個名爲SpecialDog類延伸狗,並有一個構造函數接受一個雙和傳遞給狗使用超級()。快速JAVA繼承問題

什麼(如果有的話)之間的差異:

Dog dog = new SpecialDog(12.0); 
SpecialDog dog = new SpecialDog(12.0); 
Dog dog = new Dog(12.0); 
SpecialDog dog = new Dog(12.0); 

謝謝!

+0

除了下面的答案,請看看所謂的「策略」設計模式。如果你能理解這種模式會發生什麼,你會看到這個想法的力量。 – jmq 2011-02-19 01:49:45

+1

JAVA,我想是1995年了。 – 2011-02-19 05:36:47

回答

5

回答您的問題(他們都是不同的):

Dog dog = new SpecialDog(12.0); 

在這裏,你正在創建一個SpecialDog,但使用狗參考指向它。對象一種特殊的狗,但是,除非您下載dog變量,否則您只能將dog視爲Dog而不是SpecialDog

SpecialDog dog = new SpecialDog(12.0); 

在這裏,您正在創建一個SpecialDog,並使用SpecialDog引用指向它。

Dog dog = new Dog(12.0); 

這是一個編譯器錯誤,因爲您不能實例化抽象類。

SpecialDog dog = new Dog(12.0); 

這只是一個編譯器錯誤。您不能將超類分配給子類引用。記住:繼承是一個「是-A」的關係。雖然SpecialDog始終是可能並不總是SpecialDog

3

如果您Dog類是抽象然後

Dog dog = new Dog(12.0); 
SpecialDog dog = new Dog(12.0); 

將無法​​編譯。

爲了回答您的評論一個問題:

如果使用Dog變量,你將只能使用Dog類的方法。 如果在這種情況下嘗試使用SpecialDog的方法,則編譯器將生成錯誤。

+0

這樣想。謝謝:) 如果我將它聲明爲Dog或SpecialDog,它會改變什麼嗎?我的意思是,如果狗被聲明爲狗的類型,我可以使用在類SpecialDog中找到的方法,如下所示:dog.someMethod() – n0pe 2011-02-19 01:36:22

0

創建一個SpecialDog,將其分配給Dog變量,如果您想使用SpecialDog唯一功能,則需要進行強制轉換。

Dog dog = new SpecialDog(12.0); 

創建一個SpecialDog並將其分配給一個SpecialDog變量。沒什麼特別的。

SpecialDog dog = new SpecialDog(12.0); 

剩下的兩個嘗試創建一個抽象類的實例,並且不會編譯。

1

Dog dog = new SpecialDog(12.0);在您的代碼中使用polymorphism。換句話說,它將在未來的API中提升可擴展性。

例如,如果你的方法接受Dog作爲參數,那麼任何狗可以被傳遞到該方法: -

// you can pass SpecialDog, SkinnyDog, UglyDog into this API to make the dog fat 
public void makeMeFat(Dog dog) { 
    ... 
} 

然而,如果該方法只接受特定類型的狗的,則只有該狗在該方法中: -

// you can only pass SpecialDog into this API 
public void makeMeFat(Special dog) { 
    ... 
} 

如果您Dog是一個抽象類,那麼你就不能使用它來創建另一個狗,因爲一個抽象類只有部分實現。所以,創建一個抽象類的狗是不可能的。在現實世界中,你可能會得到一條3條腿,抽象的Dog ...但至少在編程世界,你會得到一個編譯錯誤,因爲編譯器上帝不想要一條三條腿的狗。 :)