2015-02-06 138 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

相关问题