2012-01-25 14 views
6

Se crea una instancia de superclase cuando instanciamos una clase en particular en java. Si ese es el caso, habría una sobrecarga de instanciar todas las súper clases. Probé siguiente código:¿Se crea una instancia de superclase cuando instanciamos un objeto?

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

public class BClass extends AClass{ 
    public BClass(){ 
     System.out.println("Constructor B"); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     BClass b = new BClass(); 
    } 
} 

La salida del código es:

Constructor A 

Constructor B 

Entonces, ¿quiere decir que la jerarquía completa de los objetos de las superclases se crean cuando creamos una instancia de una clase?

Respuesta

8

un solo objeto es creado - pero ese objeto es una instancia de tanto la superclase y la subclase (y java.lang.Object sí mismo). No hay tres objetos separados. Hay un objeto con un conjunto de campos (básicamente la unión de todos los campos declarados arriba y abajo de la jerarquía) y un encabezado de objeto.

Los constructores son ejecutados todo el camino hasta la jerarquía de herencia - pero la referencia this será el mismo para todos los constructores; todos están contribuyendo a la inicialización del único objeto.

+0

Siempre he pensado (incorrectamente) que se crean una subclase separada y objetos de una superclase separados al crear un objeto de una subclase. – abc

+0

Y así es como funciona en Python también o para el caso C++ (creo, no lo he intentado). Correcto ? – abc

2

Sí, ese es el objetivo de la herencia de clases.

No estás instanciando dos objetos: estás instanciando un objeto y ejecutando el AClass y luego el constructor BClass en él. El constructor AClass es responsable de inicializar las partes que se heredaron de AClass, y el constructor BClass es responsable de inicializar las cosas adicionales definidas en BClass.

+0

Siempre pensé (incorrectamente) que se crean una subclase separada y objetos de una superclase separada al crear un objeto de una subclase. – abc

2

Sí.

BClass constructor se ve así:

public BClass() 
{ 
    super(); // hidden line, added by compiler 
    System.out.println("Constructor B"); 
} 

Si no desea utilizar constructor por defecto, puede hacerlo de esta manera:

public BClass() 
{ 
    super (parameters); // now you will use different constructor from AClass 
         // compiler will not add here call to "super()" 
    System.out.println("Constructor B"); 
} 

Desde el sitio de Oracle: Si un constructor no invoca explícitamente un constructor de superclase, el compilador de Java inserta automáticamente una llamada al constructor sin argumento de la superclase. Si la superclase no tiene un constructor sin argumentos, obtendrá un error en tiempo de compilación. Object tiene un constructor así, por lo que si Object es la única superclase, no hay problema.

+0

+1 para indicar explícitamente la línea oculta "super()". Este fue un punto de confusión para mí cuando comencé a codificar en Java. –

Cuestiones relacionadas