una tipos tener sirve que puede por para metodos herencia defecto cuantos constructores comando clases clase java constructor

tipos - para que sirve el comando super en java



Java-Método ejecutado antes del constructor predeterminado (6)

Esta pregunta ya tiene una respuesta aquí:

Estoy aprendiendo java y accidentalmente encontré el siguiente código donde se ejecuta el constructor predeterminado después del método.

public class ChkCons { int var = getVal(); ChkCons() { System.out.println("I''m Default Constructor."); } public int getVal() { System.out.println("I''m in Method."); return 10; } public static void main(String[] args) { ChkCons c = new ChkCons(); } }

SALIDA:

I''m in Method. I''m Default Constructor.

¿Puede alguien explicarme por qué sucedió esto?

Gracias.



El constructor se llama antes del método. La ejecución del método se produce después de eso, que forma parte de la creación del objeto en el que se evalúan las variables de instancia. Esto podría entenderse mejor a partir del siguiente código.

class SuperClass{ SuperClass(){ System.out.println("Super constructor"); } } public class ChkCons extends SuperClass{ int var = getVal(); ChkCons() { System.out.println("I''m Default Constructor."); } public int getVal() { System.out.println("I''m in Method."); return 10; } public static void main(String[] args) { ChkCons c = new ChkCons(); } }

El código anterior tiene salida siguiente

Super constructor I''m in Method. I''m Default Constructor.

Aquí el compilador agrega automáticamente super(); como la primera declaración en el constructor ChkCons() , y por lo tanto se llama antes del método getVal() .


Expresiones de inicialización de variables de instancia como int var = getVal(); se evalúan después de que se ejecute el constructor de la superclase pero antes de la ejecución del cuerpo del constructor de la clase actual.

Por getVal() tanto, se llama a getVal() antes de que se ejecute el cuerpo del constructor ChkCons .


Podemos consultar la siguiente documentación de Oracle en Inicializar variables de instancia (el énfasis es mío):

Inicializando miembros de instancia

Normalmente, pondría código para inicializar una variable de instancia en un constructor. Existen dos alternativas al uso de un constructor para inicializar variables de instancia: bloques de inicialización y métodos finales.

Los bloques de inicialización para las variables de instancia parecen bloques de inicialización estáticos, pero sin la palabra clave estática:

{// el código que sea necesario para la inicialización va aquí}

> El compilador de Java copia los bloques de inicialización en cada constructor. Por lo tanto, este enfoque se puede utilizar para compartir un bloque de código entre varios constructores.

Un método final no se puede anular en una subclase. Esto se discute en la lección sobre interfaces y herencia. Este es un ejemplo del uso de un método final para inicializar una variable de instancia:

class Whatever { private varType myVar = initializeInstanceVariable(); protected final varType initializeInstanceVariable() { // initialization code goes here } }

https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html


Se debe a que está inicializando el método en un campo usando int var = getVal(); , por lo que se ejecutará antes de la llamada al constructor. Bloqueo estático tiene la primera prioridad, se ejecuta durante la carga de la clase.


public class InitializerIndex { public InitializerIndex() { // TODO Auto-generated constructor stub System.out.println("Default Constructor"); } static { System.out.println("Static Block one"); } { System.out.println("Init one"); } void letsRoll() { } public static void main(String[] args) { new InitializerIndex().letsRoll(); new InitializerIndex().letsRoll(); } { System.out.println("Init Two"); } static { System.out.println("Static Block two"); } }

Tendrá la siguiente salida:

Static Block one Static Block two Init one Init Two Default Constructor Init one Init Two Default Constructor

Primero se carga todo el contenido estático, luego el contenido de la instancia. El contenido estático se carga una sola vez.

Incluso cuando se crean dos objetos, el bloque estático se llama solo cuando se crea el primer objeto .

Además, en el momento de la creación de objetos o en constructores, si desea utilizar métodos como este

int var = getVal();

Deberías usar métodos estáticos.