我们可以在抽象 class 的派生 class 中调用 super.someMethod() 吗?

Could we call super.someMethod() in derived class from an abstract class?

我们可以从抽象 class 派生 class 中调用 super.someMethod() 吗?

例如:

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

然后导出class:

class Child extend TestBase{
   void callFunction(){

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

我想这是可以做到的。但是,如果我们有一个抽象方法,那么由于没有实现而无法调用它,对吗?

简短的回答:是的。

您始终可以调用 publicprotected 超级方法。与 java 中的任何(实例)方法一样,它将被多态处理,并且将调用具体实现,无论是超类的 class 还是派生的 class 如果它覆盖它。

是的,你是对的。如果您要扩展具有抽象方法的抽象 class,则不能调用 super.thatMethod(); 考虑以下示例

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

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

这将起作用,因为可以从 MyService 访问 doRSA()。 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() {
    }
}

现在考虑这种情况,您可以从子class

中调用 super.superClassMethod()
public abstract class  RSAService {
    protected void doRSA(){}
}

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

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

因此,如果您要覆盖超级 class 方法,您可以使用 super 调用该方法。请考虑此 Java Specification link 以获得更多说明

如果 类 在同一个包中,您的示例将有效。

如果不是这种情况,那么您应该声明该方法受保护或 public,例如:

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

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

abstract protected void abstractMethod();