3.4 Inicialización de variables - ajpaez/OCA GitHub Wiki

(OCA Objective 2.1)

Usando una variable o array que esta sin inicializar o sin asignar

Java nos permite inicializar variables al declararlas o dejarlas sin inicializar. Cuando intentamos usar una variable sin inicializar, podemos obtener distintos comportamientos dependiendo del tipo de variable o array con el que tratemos (primitivos u objetos). El comportamiento también depende del nivel (ámbito de aplicación) al que estemos declarando la variable.

Variables de instancia de tipo Object y primitivas

Las variables de instancia (tambien llamadas variables miembro) son variables definidas a nivel de clase. Esto significa que la declaracion de variable no se está haciendo dentro de ningun metodo, constructor o cualquier otro bloque inicializador. Las variables de instancia son inicializadas a sus valores por defecto cada vez que una nueva instancia es creada, a pesar de que se les puede asignar un valor explicito despues de que los objetos de los supercontructores hayan finalizado. Los valores por defecto son:

Tipo de variable Valor por defecto
Object reference null (not referencing any object)
byte, short, int, long 0
float, double 0.0
boolean false
char '\u0000'

Variables de instancia primitivas

En el siguiente ejemplo se muestra la variable year, una variable de instancia de tipo int. Cuando el programa se inicie, la variable obtendra el valor cero.

public class BirthDate {
  int year;                                 // Instance variable
  public static void main(String [] args) {
    BirthDate bd = new BirthDate();
    bd.showYear();
  }
  public void showYear() {
    System.out.println("The year is " + year);
  }
}

Variables de instancia de referencia de objetos

En el siguiente ejemplo se muestra la variable de referencia title, una variable de instancia de tipo String. Cuando el programa se inicie, la variable obtendrá el valor por defecto null.

public class Book {
  private String title;          // instance reference variable
  public String getTitle() {
    return title;
  }
  public static void main(String [] args) {
    Book b = new Book();
    String s = b.getTitle();    // Compiles and runs
    if (s != null) {
      String t = s.toLowerCase();
    }
  }
}

Variables de instancia de arrays

Un array es un objeto, por tanto, una variable de instancia que represente un array y se encuentre declarada pero no inicializada tendrá el valor null. Si se inicializa dicha variable, los elementos que contiene tienen sus valores por defecto, hasta que no se inicialicen de forma individualizada y explicita cada uno de ellos.

Primitivas y objetos locales (Stack, Automatic)

Las variables locales son definidas dentro de un método, y incluyen los parámetros de un método.

"Automatic" es otro término para las variables locales.

Primitivos locales

En el siguiente ejemplo, la variable year es una variable local.

public class TimeTravel {
  public static void main(String [] args) {
    int year = 2050;
    System.out.println("The year is " + year);
  }
}

Las variables locales SIEMPRE deben ser inicializadas antes de ser usadas. Java no asigna valores por defecto a las variables locales, estas deben ser inicializadas de forma explicita. Si no se inicializan obtendremos un error al compilar (siempre y cuando las usemos).

Podemos encontrarnos en algunas situaciones en las que si se inicializa una variable local dentro de un bloque de codigo condicional el compilador no sabrá si dicha variable a sido inicializada o no. Por ejemplo:

 public class TestLocal {
  public static void main(String [] args) {
    int x;
    if (args[0] != null) { // assume you know this is true
      x = 7;               // compiler can't tell that this statement will run
    }
    int y = x;             // the compiler will choke here
  }
}

En este caso obtendremos un error del compilador indicando que la variable x podria no haber sido inicializada.

Referencias a objetos locales

Las variables de instancia locales de referencia de objetos también se pueden dejar sin inicializar, y posteriormente a lo largo del código comprobar si dicha referencia es null antes de usarla. Las variables de referencia declaradas localmente no pueden usarse sin inicializar, a menos que se inicialicen explícitamente a null. Al igual que las variables primitivas locales, estas tampoco JAVA le asigna un valor por defecto.

Arrays locales

AL igual que las dos anterior, los arrays declarados dentro de un método deben de tener un valor antes de ser usados. Es suficiente con declarar e inicializar dicho array, sin importar los elementos que contiene. Al igual que los arrays de instancia, los arrays locales también inicilizan sus elementos a sus valores por defecto cuando el array es inicializado.

Asignando una variable de referencia a otra

Al igual que en las variables primitivas al asignar una variable a otra se copia el contenido, con las variables de referencia ocure lo mismo. El contenido de una variable de referencia es un patron de bit, por lo que si asignamos una variable de referencia a1 a otra variable de referencia b1, el patron de bits de a1 es copiado y una nueva copia se setea en b1. Por tanto, al hacer un cambio en cualquier variable de instancia de a1, dicho cambio se vera reflejado en b1.