Variables y referencias a objetos

Una variable, es conceptualmente un recipiente donde guardamos un dato. Java es un lenguaje fuertemente tipado. Las variables se definen siempre con un tipo asociado. No se puede meter en una variable ningún dato que no sea del tipo con que se definió.

Declaración de una variable

Para definir una variable en Java, basta con escribir un tipo, seguido del nombre que queremos dar a la variable.

    int i;
    Date date;
  

Aquí se define la variable i del tipo primitivo entero int y la variable date de tipo Date. El punto y coma es el separador de instrucciones en Java.

Además podemos ver que Java, es sensible a las mayúsculas “case sensitive”. En java Date, date o dAte son identificadores completamente distintos con ninguna relación.  

    i = 5;
    date = new Date();
  

Aquí vemos como podemos asignar o guardar datos dentro de las variables.

En la segunda línea vemos como se crea y se guarda un objeto de tipo Date en la variable date. En realidad lo que guarda la variable date, no es el objeto, sino una referencia al objeto.

Referencias a Objetos

Una variable es un lugar en la memoria donde se guarda un dato. Para ser exacto, este lugar en la memoria es la Pila o Stack. En el caso de los datos primitivos, como en “int i = 5” hay cuatro bytes en la Pila donde se almacena el número 5.

Cuando se crea un objeto en Java, como en “new Date()” , el objeto se guarda en una parte de la memoria llamada Heap. Cuando asignamos el objeto a una variable como en “date = new Date()”, lo que guardamos en date es la dirección de memoria Heap donde está el objeto.

Veamos las implicaciones de este referenciamiento indirecto con un ejemplo de código.

    int i1 = 5;
    int i2 = i1;
    Date date1 = new Date();
    Date date2 = date1;
  

Cómo queda en la memoria después de ejecutar las asignaciones anteriores, se ve en el gráfico siguiente. En la Pila o Stack vemos que se guardan las 4 variables. i1 e i2 tienen copias independientes del valor 5. Diferente es el caso de date1 y date2, donde estas variables guardan un puntero al mismo objeto.

Memoria: Pila y Heap

Lo importante aquí, es entender que cualquier modificación dentro del objeto Date, se verá reflejada tanto en date1 como date2. Este comportamiento suele traer confusiones y errores. El problema no existe en el caso de i1 e i2, si modificamos i1 por ejemplo “i1 = 3”, i2 seguirá valiendo 5.

Inicialización por defecto y valor null

Cuando declaramos una variable, pero no la inicializamos, Java la inicializa automáticamente. En el caso de los tipos primitivo escoge un valor por defecto, por ejemplo 0, para los numéricos como int.

En el caso de los objetos, se inicializa con un valor o referencia llamado null. Por ejemplo es lo mismo escribir “Date date = null;” que “Date date;”

Variable de instancia o campo miembro del objeto

Una variable de instancia o campo, es una variable asociada a un objeto. Se dice que es una variable o campo, miembro del objeto. Se declara en el cuerpo de la clase.  

Cada vez que se crea una nueva instancia de un objeto, se crea una nueva variable asociada al objeto. Existe una por cada objeto creado y si no se ha creado ningún objeto, no es accesible.

Por ejemplo si creamos una clase Persona podría tener los campos nombre, apellido, dirección, etc.

    class Persona{
       String nombre;
       String apellido;
       String dirección;
    ...
    }
  

A continuación podemos ver, como se puede acceder los campos de un objeto persona:

    Persona persona = new Persona();
    persona.nombre = "Eduardo";
    persona.apellido = "Medina";
    persona.direccion = "Gran Via 27";
  

Variable estática

Una variable estática está asociada a una clase y no a un objeto. Para acceder a ella, basta escribir el nombre de la clase seguido de un punto y el nombre de la variable estática. No es necesario crear ningún objeto.

Se declara en el cuerpo de la clase igual que el campo, pero se le antepone la palabra “static” a la declaración.

Por ejemplo, en la clase Persona, podríamos definir una variable estática totalDePersonas, para contar cuantos objetos personas tenemos. Para declarar esta variable estática sería:

  static int totalDePersonas;

Para usar la variable sería:

Persona.totalDePersonas = 5;