2012-06-11 10 views
10

Esta es una pregunta por curiosidad.Polimorfismo de Java

Sé que cuando llamamos al método reemplazado de un objeto de subclase por la referencia de su superclase, JVM da importancia al tipo de objeto y no al tipo de referencia.

Este es mi código simple:

class Animal 
{ 
    void eat() 
    { 
     System.out.println("Animal is eating..."); 
    } 
} 
class Horse extends Animal 
{ 
    @Override 
    void eat() 
    { 
     System.out.println("Horse is eating..."); 
    } 
} 
public class PolymorphismTest 
{ 
    public static void main(String...args) 
    { 
     Animal a=new Animal(); 
     a.eat(); 

     Animal h= new Horse(); 
     h.eat(); 
    } 
} 

Como era de esperar, consigo la salida:

run: 
Animal is eating... 
Horse is eating... 
BUILD SUCCESSFUL (total time: 0 seconds) 

Ahora mi pregunta es, ¿Hay alguna manera de que podamos usar de referencia h llamar el método superclass eat() y no la subclase uno? Sé que esta es una pregunta que va en contra de las leyes del polimorfismo, pero nunca se sabe cuándo puede surgir la necesidad de hacerlo.

Traté de escribir la referencia h en Animal pero no tuve suerte. ¿Algunas ideas?

+0

duplicado Posible de http://stackoverflow.com/questions/5411434/how-to-call-a-superclass-method-using-java-reflection –

+2

Y también es posible duplicado de http: // stackoverflow. com/questions/1032847/can-java-call-parent-overridden-method-in-other-objects-but-not-subttype –

+0

Estoy de acuerdo. Perdón por no pasar por eso. Investigué pero no pude encontrar esto. – Kameron

Respuesta

5
class Horse extends Animal 
{ 
    @Override 
    void eat() 
    { 
     super.eat(); 
    } 
} 
+0

Sí, no se debe llamar a la implementación de la clase padre para cumplir con las leyes del polimorfismo. Volveré a pegar este enlace: http://stackoverflow.com/questions/1032847/can-java-call-parent-overridden-method-in-other-objects-but-not-subtype –

4

No, usted tiene que hacer de manera explícita en el método reemplazado (es decir super.eat()).

2

No puede hacer esto haciendo cualquier tipo de conversión. La única manera de llamar al método de la superclase es envolverlo como lo mostró Brett Holt, o debe tener un objeto cuyo tipo de tiempo de ejecución más específico sea Animal.

2

En Java: todos los métodos son métodos virtuales cuya implementación más reciente se utiliza al llamar a la función.

Para responder a su pregunta, por favor haga el método static en la clase Animal y luego obtendrá el método de comer de la clase Animal llamado.

static void eat(){ 
     System.out.println("Animal is eating..."); 
}