2010-04-23 63 views
9

如果我有一個基類,它 Base thing = null; 的還有一個子類 class Subclass extends Base 我鼓動它作爲 thing = new Subclass 我將如何調用就是專門在子類的方法,但不在基地? ex。 Base只有method() Subclass已經method()specialMethod() 方法specialMethod()是一個我想打電話。調用子類的方法,在Java中

+2

這通常是一個壞主意。如果你知道這個對象是Subclass類型的,那就把它稱爲那個,你沒問題。如果該方法真的屬於Base - 將其放入Base中。 – 2010-04-23 18:56:25

回答

12

如果你知道thing包含Subclass,你可以這樣做:

((Subclass) thing).specialMethod() 
+6

請注意,如果事物不是'Subclass',則會用'ClassCastException'炸彈......如果您不確定,請使用'instanceof'來檢查'thing'是否是'Subclass'。 – Powerlord 2010-04-23 18:55:38

1

您必須鍵入或鑄事情的子類。所以:

 Subclass thing = new Subclass(); 

或:

 ((Subclass) thing).specialMethod(); 
7

你必須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(); 

但一如既往,這取決於什麼是你想做。

+0

'if'語句應該可能有'else' ... – 2010-04-23 19:04:28

3

當繼承/多態性Java的處理有兩種基本類型強制轉換中您可以看到:

上溯造型:

Superclass x = new Subclass(); 

這是隱含的,不需要硬鑄鐵因爲Java知道Superclass可以做的一切,Subclass也可以做。

溯造型

Superclass x = new Subclass(); 

Subclass y = (Subclass) x; 

在這種情況下,你需要做一個硬鑄鐵因爲Java是不是很確定這是否會工作或沒有。你必須通過告訴它你知道你在做什麼來安慰它。原因是因爲子類可能有一些超類沒有的奇怪方法。一般來說,如果你想實例化一個類來調用它的子類中的某些東西,你應該實例化子類以開始 - 或者確定該方法是否也應該在超類中。

16

其他人已經提到過如何投擲物體以獲得對您問題的回答,但先問這個問題指出了可能的設計問題。一些可能的原因:

+1

只是將其更改爲「可能的設計問題」,我完全同意。 – David 2010-04-23 22:41:14

0

另一種方法可能是做到以下幾點:

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從子類」。