2015-02-06 94 views
1

我們可以從抽象類中派生類中調用super.someMethod()嗎?我們能否從抽象類的派生類中調用super.someMethod()?

在立場:

abstarct class TestBase{ 
    void nonabstractMethod(){ 
    .... 
    } 
} 

然後派生類:

class Child extend TestBase{ 
    void callFunction(){ 

    } 
    void nonabstractMethos(){ 
    super.nonabstractMethos(); 
    } 
} 

我認爲這是可以做到。但是如果我們有一個抽象方法,那麼它就不能被調用,因爲沒有實現,我是否正確?

+1

嘗試一下,你會看到結果。 – 2015-02-06 09:38:02

回答

1

是的你是對的。如果你正在擴展一個具有抽象方法的抽象類,你不能調用super.thatMethod(); 考慮下面的例子

public class RSAService { 
    protected void doRSA(){} 
} 

class MyService extends RSAService{ 
    public void myService(){ 
     super.doRSA(); //Works fine 
    } 
} 

這將工作作爲doRSA()是從MyService訪問。同爲public而不是private

public abstract class RSAService { 
    protected abstract void doRSA(); 
} 

class MyServe extends RSAService{ 
    public void myService(){ 
     super.doRSA(); //This won't work 
    } 

    @Override 
    protected void doRSA() { 
    } 
} 

現在考慮這種情況下,在那裏你可以從你的子類

public abstract class RSAService { 
    protected void doRSA(){} 
} 

class MyService extends RSAService{ 
    public void myService(){ 
    } 

    @Override 
    protected void doRSA() { 
     super.doRSA(); 
    } 
} 

所以,如果你來推翻調用super.superClassMethod()超類方法可以使用super來調用方法。考慮這個Java Specification的鏈接以獲得更多的說明

+2

在他的例子中,抽象方法不受保護,所以..只有當兩個類都在同一個包中時,它纔會起作用。 – 2015-02-06 09:40:14

+0

謝謝@shikjohari的例子。 – diplomaticguru 2015-02-06 09:40:17

1

簡短回答:是的。

您可以隨時撥打publicprotected超級方法。和java中的任何(實例)方法一樣,它將被處理爲polymorphicly,並且一個具體的實現將被調用,無論是super類還是派生類,如果它重寫的話。

+0

謝謝穆里尼克的回答。 – diplomaticguru 2015-02-06 09:43:54

1

如果兩個類都在同一個包中,您的示例將可用。

如果不是的話,那麼你應該申報法保護的或公共的,是這樣的:

abstract class TestBase{ 
    protected void nonabstractMethod(){ 
    .... 
    } 
} 

如果你的方法是抽象的,那麼你就不能調用它,例如:

abstract protected void abstractMethod(); 
+0

謝謝Caelos的回答。 – diplomaticguru 2015-02-06 09:43:33