如果我有一個基類,它 Base thing = null;
的還有一個子類 class Subclass extends Base
我鼓動它作爲 thing = new Subclass
我將如何調用就是專門在子類的方法,但不在基地? ex。 Base
只有method()
Subclass
已經method()
和specialMethod()
方法specialMethod()
是一個我想打電話。調用子類的方法,在Java中
回答
如果你知道thing
包含Subclass
,你可以這樣做:
((Subclass) thing).specialMethod()
請注意,如果事物不是'Subclass',則會用'ClassCastException'炸彈......如果您不確定,請使用'instanceof'來檢查'thing'是否是'Subclass'。 – Powerlord 2010-04-23 18:55:38
您必須鍵入或鑄事情的子類。所以:
Subclass thing = new Subclass();
或:
((Subclass) thing).specialMethod();
你必須cast
它能夠調用的方法:
Base thing = new SubClass();
((SubClass) thing).specialMethod();
如果您遇到這種情況,很可能是你不這樣做有正確的界面(正確的方法)
在深入到舞臺之前你開始驗證一切都知道,如果你可以調用一個方法或不喜歡:
public void x (Base thing) {
if(thing.instanceof Subclass) {
((SubClass)thing).specialMethod();
}
}
考慮一下,如果你不需要移動specialMethod
起來層級,所以它屬於基地。
如果你肯定不需要它的基礎,但你需要在子類中至少要考慮使用正確的類型:
SubClass thing = ...
// no need to cast
thing.specialMethod();
但一如既往,這取決於什麼是你想做。
'if'語句應該可能有'else' ... – 2010-04-23 19:04:28
當繼承/多態性Java的處理有兩種基本類型強制轉換中您可以看到:
上溯造型:
Superclass x = new Subclass();
這是隱含的,不需要硬鑄鐵因爲Java知道Superclass
可以做的一切,Subclass
也可以做。
溯造型
Superclass x = new Subclass();
Subclass y = (Subclass) x;
在這種情況下,你需要做一個硬鑄鐵因爲Java是不是很確定這是否會工作或沒有。你必須通過告訴它你知道你在做什麼來安慰它。原因是因爲子類可能有一些超類沒有的奇怪方法。一般來說,如果你想實例化一個類來調用它的子類中的某些東西,你應該實例化子類以開始 - 或者確定該方法是否也應該在超類中。
其他人已經提到過如何投擲物體以獲得對您問題的回答,但先問這個問題指出了可能的設計問題。一些可能的原因:
- 該方法是在錯誤的地方。
- 調用該方法的代碼位於錯誤的位置。
- 子類不應該擴展其他類。最好到prefer composition over inheritance。當繼承時,代碼應該遵循Liskov substitution principle。
- 這些課程是non-cohesive,他們有超過one responsibility,他們應該分成多個類。
只是將其更改爲「可能的設計問題」,我完全同意。 – David 2010-04-23 22:41:14
另一種方法可能是做到以下幾點:
public abstract class Base {
//method() not implemented
public abstract void specialMethod();
}
public class Subclass extends Base {
//method() not implemented
@Override
public void specialMethod() {
//put your code here
System.out.println("specialMethod from Subclass");
}
}
所以,你可以這樣做:
thing.specialMethod();
,它會給你: 「specialMethod從子類」。
- 1. Java調用子類方法
- 2. Java調用子類的前父方法
- 3. 調用子類方法的Java
- 4. Java的繼承:在超類中調用子類方法
- 5. 從Java子類中調用的方法不是在父類
- 6. 在java中調用父類型時調用子方法
- 7. Ruby中的子類方法在父類中調用方法
- 8. Java繼承:在超類中調用子類方法
- 9. 在子類對象上調用父類的方法java
- 10. 調用子類的方法
- 11. 調用子類的方法
- 12. 調用子類的方法
- 13. 在java中調用匿名類方法
- 14. 在子類中調用父方法
- 15. JAVA:如何調用一個對象的子類中的方法?
- 16. java - 被調用的子類中的覆蓋方法
- 17. 主類中的Java調用方法
- 18. 調用Java類中的方法
- 19. 從子類調用ViewController中的方法
- 20. 調用子類中的圖形方法
- 21. 調用繼承中的子類方法
- 22. 調用父類的子方法在PHP
- 23. 調用方法在UIView的子類
- 24. 超類的子類的調用方法
- 25. 超類的子類的調用方法
- 26. Java超級方法調用子類型重寫方法
- 27. UIViewController子類調用方法
- 28. 從子類中的重載方法調用基類方法
- 29. 如何從超類方法中調用python子類的方法?
- 30. 多線程中的Java調用子類方法
這通常是一個壞主意。如果你知道這個對象是Subclass類型的,那就把它稱爲那個,你沒問題。如果該方法真的屬於Base - 將其放入Base中。 – 2010-04-23 18:56:25