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 Test
lo 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 static
se 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;