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

Java 我们可以从抽象类调用派生类中的super.someMethod()吗?,java,inheritance,abstract-class,Java,Inheritance,Abstract Class,我们可以在从抽象类派生的类中调用super.someMethod() 对于站姿: abstarct class TestBase{ void nonabstractMethod(){ .... } } 然后派生类: class Child extend TestBase{ void callFunction(){ } void nonabstractMethos(){ super.nonabstractMethos(); } } 我想这是可以做到

我们可以在从抽象类派生的类中调用
super.someMethod()

对于站姿:

abstarct class TestBase{
   void nonabstractMethod(){
   ....
  }
}
然后派生类:

class Child extend TestBase{
   void callFunction(){

   }
   void nonabstractMethos(){
   super.nonabstractMethos();
  }
}
我想这是可以做到的。但是如果我们有一个抽象方法,那么它就不能被调用,因为没有实现,对吗?

简短的回答是:是的


您始终可以调用
public
protected
超级方法。与java中的任何(实例)方法一样,它将被polimorphic处理,并将调用一个具体的实现,无论是超级类还是派生类(如果它重写它)。

是的,您是正确的。如果要扩展具有抽象方法的抽象类,则不能调用super.thatMethod(); 考虑下面的例子

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

class MyService extends RSAService{
    public void myService(){
        super.doRSA(); //Works fine
    }
}
这将起作用,因为可以从
MyService
访问doRSA()。与
public
相同,但不适用于
private

但是

现在考虑这个例子,您可以从子类

调用Suff.SuxCub方法()。
public abstract class  RSAService {
    protected void doRSA(){}
}

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

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

因此,如果要重写一个超类方法,可以使用
super
调用该方法。考虑这个链接可以更清楚地说明

如果两个类都在同一个包中,您的示例将起作用。

如果情况并非如此,则应将该方法声明为受保护或公共,例如:

abstract class TestBase{
   protected void nonabstractMethod(){
   ....
   }
}
如果方法是抽象的,则不能调用它,例如:

abstract protected void abstractMethod();

试试看,你就会看到结果。在他的例子中,抽象方法没有受到保护,所以。。只有当两个类都在同一个包中时,它才会起作用Hank you@shikjohari提供了解释良好的示例。谢谢Caelos给出的答案。谢谢Mureinik给出的答案。
abstract protected void abstractMethod();