Necesitamos tu apoyo para extender nuestros artículos en referencia a las ciencias de la computación.
Solución:
En el primer ejemplo de código, a
es un main
variable local del método. Las variables locales del método deben inicializarse antes de usarlas.
En el segundo ejemplo de código, a
es una variable miembro de la clase, por lo que se inicializará con el valor predeterminado.
Lea su referencia con más cuidado:
Valores predeterminados
No siempre es necesario asignar un valor cuando un campo se declara.
Campos que se declaran pero no se inicializan se establecerán en un valor predeterminado razonable por el compilador. En términos generales, este valor predeterminado será cero o null, dependiendo del tipo de datos. Sin embargo, confiar en tales valores predeterminados generalmente se considera un mal estilo de programación.El siguiente gráfico resume los valores predeterminados para los tipos de datos anteriores.
. . .
Las variables locales son ligeramente diferentes; el compilador nunca asigna un valor predeterminado a una variable local no inicializada. Si no puede inicializar su variable local donde está declarada, asegúrese de asignarle un valor antes de intentar usarla. Acceder a una variable local no inicializada dará como resultado un error en tiempo de compilación.
Estos son los principales factores involucrados:
- variable miembro (OK por defecto)
- static variable (predeterminado OK)
- variable miembro final (no inicializada, debe establecerse en el constructor)
- final static variable (no inicializada, debe establecerse en un static cuadra )
- variable local (no inicializada)
Nota 1: debe inicializar las variables miembro finales en cada constructor implementado!
Nota 2: debe inicializar las variables miembro finales dentro del bloque del propio constructor, sin llamar a otro método que las inicialice. Por ejemplo, esto es no válido:
private final int memberVar;
public Foo()
// Invalid initialization of a final member
init();
private void init()
memberVar = 10;
Nota 3: las matrices son objetos en Java, incluso si almacenan primitivas.
Nota 4: cuando inicializa un array, todos sus elementos están configurados por defecto, independientemente de ser miembro o local. array.
Adjunto un ejemplo de código, presentando los casos antes mencionados:
public class Foo
// Static and member variables are initialized to default values
// Primitives
private int a; // Default 0
private static int b; // Default 0
// Objects
private Object c; // Default NULL
private static Object d; // Default NULL
// Arrays (note: they are objects too, even if they store primitives)
private int[] e; // Default NULL
private static int[] f; // Default NULL
// What if declared as final?
// Primitives
private final int g; // Not initialized. MUST set in the constructor
private final static int h; // Not initialized. MUST set in a static
// Objects
private final Object i; // Not initialized. MUST set in constructor
private final static Object j; // Not initialized. MUST set in a static
// Arrays
private final int[] k; // Not initialized. MUST set in constructor
private final static int[] l; // Not initialized. MUST set in a static
// Initialize final statics
static
h = 5;
j = new Object();
l = new int[5]; // Elements of l are initialized to 0
// Initialize final member variables
public Foo()
g = 10;
i = new Object();
k = new int[10]; // Elements of k are initialized to 0
// A second example constructor
// You have to initialize final member variables to every constructor!
public Foo(boolean aBoolean)
g = 15;
i = new Object();
k = new int[15]; // Elements of k are initialized to 0
public static void main(String[] args)
// Local variables are not initialized
int m; // Not initialized
Object n; // Not initialized
int[] o; // Not initialized
// We must initialize them before use
m = 20;
n = new Object();
o = new int[20]; // Elements of o are initialized to 0