2011-09-20 14 views
5

que tengo tres clases:Constructor llamada

public class A { 
    public A(){ 
     System.out.println("in A"); 
    } 
} 


public class B extends A{ 

    public B(){ 
     System.out.println("in b"); 
    } 
} 


public class C extends B{ 

    public C(){ 
     System.out.println("in C"); 
    } 
} 

Ahora estoy realmente seguro de cómo el constructor llama trabajo. Si instanciamos C c= new C();, en qué orden (y por qué esa orden) se llama a los constructores. Si instancia la clase C, ¿no debería simplemente comprobar si la clase C tiene un constructor o no y, en caso afirmativo, lo usará?

¿Por qué sale-> En A En B En C?

¿No sube en la jerarquía solo cuando no encuentra el constructor en su propia clase? ¿O los constructores de la superclase se llaman implícitamente cada vez?

Respuesta

3

Super constructor se llaman por defecto desde el constructor de la clase base.

El único caso en el que debe llamar a un constructor de clase superior con súper, es cuando necesita pasar explícitamente un parámetro al propio constructor de clase superior.

Así que la respuesta es sí, todos son llamados. El orden es de la clase más avanzada en la jerarquía hasta la clase base, por lo que: A, B, C.

1

Cuando se invoca un constructor, primero llama al super(), por lo que el rastro de la pila mostrará: C- > B-> A, en realidad se invocará una primera y C se invocará el pasado, por lo que la impresión se mostrará:

in A 
in B 
in C 
+0

Que "en realidad se invocará A primero" la redacción es engañosa. El constructor de C se llama primero porque está inicializando una instancia de tipo C. La orden de impresión es causada por el flujo de control para los constructores en la jerarquía, no porque el constructor de A se llama primero. –

+0

@Anthony: Intenté explicar esta idea en mi respuesta, si tiene un término mejor, con mucho gusto lo usaré, desafortunadamente el inglés no es mi lengua materna ..: \ – amit

0

super() está implícito, como los constructores por defecto si no hay constructores declarados.

Los constructores aparecen en orden creciente: constructores

C calls B, B calls A, A calls to Object that does nothing and return to A, then outputs and return the flow to B, that outputs and return to C that outputs. 
2

por defecto siempre se invocan y se invocan de arriba hacia abajo - de la más alta super-clase a los más bajos de la clase base.

Tenga en cuenta que la llamada super(...) es necesaria solo para constructores parametrizados. En su caso, no tiene ninguno, por lo que se llama automáticamente a los valores predeterminados.

+0

+1 para una buena explicación ;-) – Deepak

0

El constructor Súper se llama por defecto. Se ejecuta antes de cualquier línea de código en el constructor de la clase derivada. Entonces, si llamas a C nuevo(), se ejecuta el constructor de A, luego B, y luego cualquier cosa en C.

0

Sí, cuando no define ningún constructor, creará implícitamente el constructo predeterminado y lo llamará. Ahora cuando extiendes cualquier clase, entonces como la clase C, va con su constructor, pero allí no encontró llamar a la superclase explícitamente, por lo que el compilador llama implícitamente al constructor de la superclase.Por eso cuando llamamos al constructor de la superclase que la declaración siempre en primer lugar como éste modo

public C(){ 
    super(); 
} 

si se escribe ninguna instrucción antes de llamar al constructor de la superclase que error al obtener

0

Tome un vistazo a la especificación del lenguaje Java

"Si un cuerpo del constructor no comienza con una invocación del constructor explícito y el constructor de ser declarado no es parte de la clase de objeto primordial, entonces el cuerpo del constructor se asume implícitamente por el compilador para comenzar con una construcción de superclase o invocación "super();", una invocación del constructor de su superclase directa que no toma argumentos. "

http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#41652

0

Clase A es la superclase para B y clase B es super clase de C. Eso significa que una está en la primera posición entre ellos, donde B está en la parte superior para C, junto a una y C está en la parte inferior de B. Entonces la clase A se ejecuta primero y luego B y luego C. Es como una prioridad en Java para súper clases.

Cuestiones relacionadas