Inicialización de Objetos en Java

De ChuWiki

¿Que resultados da el siguiente código?

--------------------------------------------------------------------------------

Code:

public class Padre3
{
   protected int P1 = 2;
   protected int P2 = 2*P1;

   public static void main( String[] args )
   {
      Padre3 padre = new Padre3(  );
   }
}


Resultado tras ejecutar Padre3.class:
P1: 2 P2: 4

--------------------------------------------------------------------------------

Code:

public class Padre2
{
   protected int P1 = 2 * P2;
   protected int P2 = 3;

   public static void main( String[] args )
   {
      Padre2 padre = new Padre2(  );
   }
}


Resultado tras ejecutar Padre2.class:
Ni siquiera compila

--------------------------------------------------------------------------------

Code:

public class Padre1
{

   protected int P1 = getP1(  );
   protected int P2 = 3;

   public Padre1(  )
   {
      System.out.println( "P1: " + this.P1 + " P2: " + this.P2 );
   }

   public int getP1(  )
   {
      return this.P2 * 2;
   }

   public static void main( String[] args )
   {
      Padre1 padre = new Padre1(  );
   }
}



Resultado tras ejecutar Padre1.class:
P1: 0 P2: 3
--------------------------------------------------------------------------------

Code:

public class Padre
{
   protected int P1 = 1;
   protected int P2 = 3;

   public Padre(  )
   {
      this.setP1(  );
      System.out.println( "P1: " + this.P1 + " P2: " + this.P2 );
   }

   public void setP1(  )
   {
      this.P1 = 5;
   }

   public static void main( String[] args )
   {
      Padre padre = new Padre(  );
   }
}

public class Hijo extends Padre
{
   protected int H1 = 7;
   protected int H2 = 11;

   public Hijo(  )
   {
      System.out.println( "H1: " + this.H1 + " H2: " + this.H2 );
   }

   public void setP1(  )
   {
      this.P1 = this.H1 * 2;
   }

   public static void main( String[] args )
   {
      Hijo hijo = new Hijo();
   }
}



Resultado tras ejecutar Hijo.class:
P1: 0 P2: 3
H1: 7 H2: 11

--------------------------------------------------------------------------------


¿Sorprendido/a?

  • Java inicializa automaticamente la memoria reservada (heap) a valores por defecto (false, 0, 0.0, \u000, null)
  • La inicialización se puede hacer de tres formas

 

    • Inicializador tipo

Code:

public clase
{
  protected int atributo = 5 ;
}

    • Inicializador tipo

Code:

public clase
{
  protected int atributo;
  {
    this.atributo = 5;
  }
}

    • Constructor
      • Para cada constructor javac crea un método <init> en el .class que se encargará de ejecutar el código del constructor y alguna otra cosilla
  • Normas inicializadores
    • Se ejecutan en el orden en el que estén escritos en el código fuente
    • Un inicializador no puede referenciar otro declarado posteriormente
  • Proceso de inicialización (herencia de tres niveles:abuelo, padre e hijo)

1.     Se reserva espacio para los atributos del hijo (incluidos los heredados de padre y abuelo)

2.     Se inicializan estos atributos a los valores por defecto (null,0, false...)

3.     Se invoca el metodo <init> correspondiente del hijo

1.     Se ejecuta el <init> del padre

1.      Se ejecuta el <init> del abuelo

1.      Se ejecuta el codigo de los inicializadores del abuelo (atributos de padre e hijo siguen inicializados a valores por defecto)

2.      Se ejecuta el codigo del constructor del abuelo

2.      Se ejecuta el código de los inicializadores del padre (atributos del hijo siguen inicializados a valores por defecto)

3.      Se ejecuta el codigo del constructor del padre

2.     Se ejecuta el código de los inicializadores de hijo

3.     Se ejecuta el codigo del constructor del hijo