如果我有一個抽象類名爲狗與一個構造函數來設置它的權重(雙)和一個名爲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);
謝謝!
如果我有一個抽象類名爲狗與一個構造函數來設置它的權重(雙)和一個名爲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);
謝謝!
回答您的問題(他們都是不同的):
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。
如果您Dog
類是抽象然後
Dog dog = new Dog(12.0);
SpecialDog dog = new Dog(12.0);
將無法編譯。
爲了回答您的評論一個問題:
如果使用Dog
變量,你將只能使用Dog
類的方法。 如果在這種情況下嘗試使用SpecialDog
的方法,則編譯器將生成錯誤。
這樣想。謝謝:) 如果我將它聲明爲Dog或SpecialDog,它會改變什麼嗎?我的意思是,如果狗被聲明爲狗的類型,我可以使用在類SpecialDog中找到的方法,如下所示:dog.someMethod() – n0pe 2011-02-19 01:36:22
創建一個SpecialDog,將其分配給Dog變量,如果您想使用SpecialDog唯一功能,則需要進行強制轉換。
Dog dog = new SpecialDog(12.0);
創建一個SpecialDog並將其分配給一個SpecialDog變量。沒什麼特別的。
SpecialDog dog = new SpecialDog(12.0);
剩下的兩個嘗試創建一個抽象類的實例,並且不會編譯。
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
...但至少在編程世界,你會得到一個編譯錯誤,因爲編譯器上帝不想要一條三條腿的狗。 :)
除了下面的答案,請看看所謂的「策略」設計模式。如果你能理解這種模式會發生什麼,你會看到這個想法的力量。 – jmq 2011-02-19 01:49:45
JAVA,我想是1995年了。 – 2011-02-19 05:36:47