2012-05-01 27 views
10

Soy un estudiante AP Java y estoy practicando para mi examen. Me encontré con esta pregunta y no entiendo la respuesta:Polimorfismo y constructores

considerar las siguientes clases:

public class A 
{ 
    public A() { methodOne(); } 

    public void methodOne() { System.out.print("A"); } 
} 

public class B extends A 
{ 
    public B() { System.out.print("*"); } 

    public void methodOne() { System.out.print("B"); } 
} 

¿Cuál es la salida cuando se ejecuta el código siguiente:

A obj = new B(); 

La correcta la respuesta es B *. ¿Puede alguien explicarme la secuencia de llamadas a métodos?

+0

Agregue una instrucción de impresión al constructor de 'A', y puede ser más clara. –

Respuesta

27

Se llama al constructor B. La primera instrucción implícita del constructor B es super() (llame al constructor predeterminado de superclase). Entonces se llama al constructor de A. El constructor de A llama al super(), que invoca el constructor java.lang.Object, que no imprime nada. Luego se llama methodOne(). Como el objeto es del tipo B, se llama a la versión B de methodOne y se imprime B. Entonces el constructor B continúa ejecutándose, y se imprime *.

Debe tenerse en cuenta que llamar a un método sobrescribible desde un constructor (como el constructor de A) es una mala práctica: llama a un método en un objeto que aún no está construido.

+4

+1, especialmente para el bit de mala práctica. –

+0

Y, el método de superposición puede no funcionar como lo espera la 'Clase A'. –

+0

No sabía acerca de la llamada implícita a super(), ¡gracias! – user1104775

2

La clase base debe construirse antes que la clase derivada.

Se llama primero A() que llama a methodOne() que imprime B.

A continuación, B() se llama que imprime *.