我有一個超類動物,由貓延長,狗&獅子。這三個都有代表他們聲音的字段String sound
。 playSound(int i,String s)方法播放聲音s,i次數。是否有可能在動物超類中有一個通用方法來接收子類的字段呢?或者我必須在每個類中使用自己的「聲音」變量調用super的單獨重寫方法?是否有可能從Java的超類中調用子類的實例變量?
回答
超級無權訪問子的字段,也不應該 - 超類應該沒有依賴於他們的孩子 - 但多虧了多態,它不需要。所有你需要做的就是給超級方法makeSound()
或類似的東西,然後讓子重寫方法,每個方法都播放自己的聲音。
重,
還是我不得不在每一個與自己的調用父類獨立的,壓倒一切的方法「聲音」變量?
我不明白你的意思是「那叫超級...」。您只需在makeSound()
方法覆蓋範圍內使用子呼叫自己的聲音。
我的意思是說,如果我在Animal中有一個makeSound(int i,String s)方法,它有適用於所有東西的代碼,但是根據s改變輸出,在子類中我應該只有另一個makeSound(int i,String s)方法調用超級,傳遞它我int和他們自己的聲音變量? – platelminto
@platelminto:你應該有一個makeSound方法,它不接受一個String,而是它的String由子類提供。 –
父類不能訪問子類中的字段。這裏通常的做法是做一個抽象的吸氣劑:
protected abstract Sound getSound();
public void playSound(int times) {
for(int i=0; i<times; i++) {
getSound().play();
}
}
據我所知,不,這是不可能的。你可以嘗試在超類中進行比較,比如
if (this intanaceof of Cat)
play cat sound
但是那樣會打破多態的目的。我不明白你爲什麼想這樣做。我會這樣做:
abstract class Animal{
Sound [] sounds;
int soundI;
Animal(int soundI){
this.soundI = soundI
}
void playSound(){
sounds[i].play();
}
}
class Cat extends Animal{
Cat(){
super(5);
}
}
不好的想法做intanaceof,大多數時候總是有一個更好的方法。在這種情況下,最好的解決方案是抽象方法。 –
- 1. 實例變量在子類中不可用?從我的超類
- 2. 從超類Java實例化子類Java
- 3. 是否有可能在java中的父類中訪問子類的變量?
- 4. 從沒有實例的超類訪問子變量
- 5. 調用變量到超類的子類
- 6. 是否有必要在UITableViewCell子類中擁有實例變量?
- 7. Java中的父類和子類可以有相同的實例變量嗎?
- 8. 用於子類實例的Java淺拷貝超類實例
- 9. 超類型變量是否可以引用子類對象?
- 10. 是否有可能從java類調用android類?
- 11. 如何從子類訪問超類實例變量?
- 12. 從該類中的類中調用實例變量
- 13. 「覆蓋」子類型中的實例變量:可能的風險?
- 14. 在Java中,我可以創建「基於」超類實例的子類實例嗎?
- 15. Java,是否有可能將對象從子類轉換爲超類對象
- 16. 是否有類似'__getattribute__'的類(非實例)變量?
- 17. 是否可以從父類創建子類的實例?
- 18. 是否有可能使用類實例名稱獲取私有變量值?
- 19. 子類如何獲取超類的實例變量?
- 20. 在子類中未實例化的類變量Java
- 21. 如何從超類的實例創建子類的實例?
- 22. 是否有可能使用子類屬性中的父類的子類中的靜態變量,在actionscript 3?
- 23. 派生類中的實例變量與超類的私有實例變量具有相同的名稱?
- 24. 是否爲每個類的實例實例化私有類變量?
- 25. 從Java中的抽象類實施實例變量的實現
- 26. 調用子類從超類中重寫功能JAVA
- 27. 將子類的實例從父變量賦值給子變量
- 28. 是否可以使用多態的超類對象訪問子類的變量
- 29. 子類中的實例變量訪問
- 30. 從超類實例化子類
FWIW:您不「調用」變量,您「使用」或「訪問」或「讀取」或「寫入」或「分配給」等。你*調用函數/方法/構造函數。 –