Saltar al contenido

No se puede hacer referencia a “X” antes de que se haya llamado al constructor de supertipos, donde x es una variable final

Pudiera darse el caso de que halles algún error en tu código o proyecto, recuerda probar siempre en un ambiente de testing antes subir el código al proyecto final.

Solución:

La razón por la que el código no compilaría inicialmente es porque defaultValue es un Instancia variable de la clase Testlo que significa que cuando un objeto de tipo Test se crea, una instancia única de defaultValue también se crea y se adjunta a ese objeto en particular. Debido a esto, no es posible hacer referencia defaultValue en el constructor, ya que ni él ni el objeto han sido creados todavía.

La solución es hacer que la variable final static:

public class Test 

    private static final int defaultValue = 10;
    private int var;

    public Test() 
        this(defaultValue);
    

    public Test(int i) 
        var = i;
    

Haciendo la variable staticse asocia con la clase misma, en lugar de instancias de esa clase y se comparte entre todas las instancias de Test. Las variables estáticas se crean cuando la JVM carga la clase por primera vez. Dado que la clase ya está cargada cuando la usa para crear una instancia, el static La variable está lista para usar y, por lo tanto, se puede usar en la clase, incluido el constructor.

Referencias:

  • Mensaje del foro que hace la misma pregunta
  • Comprensión de los miembros de instancia y de clase
  • Explicación de cómo se carga el cargador de clases static Variables

es porque el defaultValue es miembro de Test instancia de que está en construcción (aún no creada)

si lo tuvieras static se cargó cuando su clase se carga por classloaders

Estás haciendo referencia a una variable que no existe todavíasi era static existiría incluso antes que el propio constructor.

Pero te enfrentarás a otro problema, ya que defaultValue convertirse staticpor lo que todas las demás instancias pueden compartir el mismo valor que quizás no le guste que sea:

public class Test 

    private final int defaultValue = 10; //this will exist only after calling the constructor
    private final static int value2= 10; //this exists before the constructor has been called
    private int var;

    public Test() 
       // this(defaultValue);    // this method will not work as defaultValue doesn't exist yet
    this(value2); //will work
    //this(10); will work
    

    public Test(int i) 
        var = i;
    

Calificaciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *