2010-08-20 178 views
1

語法來調用未覆蓋方法

public class D extends B 
{ 
    public void method() {} 
} 

public class B 
{ 
    public void method() {} 

    public void anotherMethod() { method(); } 
} 

在上面,如果你持有d的實例,比如D,d.anotherMethod()導致調用D.method。

在Java中有從另一個方法()中調用B.method()的語法嗎?

回答

3

不,沒有。派生類必須包含對super.method()的調用。

如果B想要防止子類覆蓋method(),則應聲明method()final

+0

嗯......這樣認爲,不像在C++中,如果我記得語法正確的話,你可以完成B :: method()。 – Murali 2010-08-20 18:37:20

+0

B不想阻止子類覆蓋方法(),因爲B中有其他方法想要調用重寫的方法()。當然有辦法用多種方法解決它,但只是想知道我是否可以避免它。 – Murali 2010-08-20 18:40:35

+1

這樣沒有直接的方法...解決方法是檢查類的類型並相應地調用方法,但事情會變得混亂... – 2010-08-20 18:44:27

0

您仍然可以通過顯式使用超喜歡這個這個調用超級方法:

public class D extends B{ 
    public void method() {} 
    public void anotherMethod() { super.method(); } 
} 

所需的唯一的事情是你重寫anotherMethod()。

另一種方式是這樣想的。你想anotherMethod調用B法()這樣:

public class D extends B{ 
    public void methodInternal() {} 
} 
public class B{ 
    public final void method() { 
     //... 
     methodInternal(); 
    } 
    public void methodInternal() {} 
    public void anotherMethod() { method(); } 
} 

在這裏,用戶可以通過重寫methodInternal()創造自己的method()版本,但仍然是原來的method()的行爲是否完好。

+0

是的,我是一個正在開發的B,我無法控制D,我不想讓我的B.anotherMethod()調用重寫的方法(),但是我自己的。 – Murali 2010-08-20 18:34:58

+0

然後,你必須防止子類覆蓋與方法()'final' – 2010-08-20 18:36:35

+0

我不能因爲我有B中的其他方法應該調用重載方法() – Murali 2010-08-20 18:38:32

0

你可以在Bmethod()靜態,然後把它作爲B.method()從需要的地方(你可能需要重命名靜態方法,如果你想使用的名稱爲實例方法)的實例方法。

至少這就是我在類似情況下所做的。

也許你應該重新考慮你的設計。