¿Podríamos llamar a super.someMethod() en una clase derivada de una clase abstracta?

Por ejemplo:

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

Luego clase derivada:

class Child extend TestBase{
   void callFunction(){

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

Asumo que esto se puede hacer. Pero si tenemos un método abstracto, entonces no se puede llamar porque no se implementa, ¿estoy en lo correcto?

1
diplomaticguru 6 feb. 2015 a las 12:20

3 respuestas

La mejor respuesta

Sí, estás en lo correcto. Si está ampliando una clase abstracta que tiene un método abstracto, no puede llamar a super.thatMethod (); Considere el siguiente ejemplo

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

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

Esto funcionará ya que se puede acceder a doRSA () desde MyService. Lo mismo para public pero no para private

Pero

    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() {
    }
}

Ahora considere este caso, donde puede llamar al super.superClassMethod () desde su subclase

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

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

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

Entonces, si está anulando un método de superclase, puede llamar al método usando super. Considere este enlace de especificación de Java para obtener más aclaraciones

1
shikjohari 6 feb. 2015 a las 09:40

Su ejemplo funcionará si ambas clases están en el mismo paquete.

Si ese no es el caso, entonces debe declarar el método protegido o público, algo como:

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

Si su método es abstracto, entonces no puede llamarlo, por ejemplo:

abstract protected void abstractMethod();
1
Carlos Verdes 6 feb. 2015 a las 09:35

La respuesta corta: sí.

Siempre puedes llamar a un supermétodo public o protected. Como cualquier método (instancia) en java, se manejará polimórficamente y se llamará a una implementación concreta, ya sea de la clase super o de la clase derivada si la anula.

1
Mureinik 6 feb. 2015 a las 09:26