Variables en Java (I)
Los principales aspectos que definen a una variable son:
Nombre
Alcance
Tipo
Elemental
Clase
El tratamiento de una variable de un tipo clase es bastante
diferente al que reciben las variables que contienen valores de tipos
elementales.
Un tipo elemental determina un conjunto de valores y un
conjunto de operaciones que se aplican sobre estos valores.
En ejecución, una variable de un tipo elemental mantiene un
valor que corresponde al tipo y participa en las operaciones
establecidas por su tipo.
El programador no conoce la representación interna de cada
valor ni el código de las operaciones, es un cliente de un tipo cuya
implementación esta encapsulada.
Variables en Java (II)
Una variable de tipo clase está asociada a un objeto. Un objeto
es una abstracción de una entidad identificada durante la etapa de
análisis.
El objeto tiene asociado un estado interno determinado por el
estado de los atributos en un momento determinado.
El objeto puede ejecutar algunas operaciones en respuesta a los
mensajes que recibe.
Como consecuencia de esta diferencia conceptual podemos
identificar dos diferencias concretas entre una variable asociada a un
objeto y una variable que contiene valores de un tipo elemental:
Declaración
Modificación
Variables en Java (III)
Una variable de un tipo elemental se declara mediante una
instrucción como:
int i = 1;
char ch ;
ch = ‘A’;
Cuando se ejecuten estas instrucciones se reservan espacios de
memoria y se asignan directamente lo valores especificados. Una nueva
asignación modifica el valor almacenado:
i = i * j;
Una variable de un tipo clase se declara mediante una instrucción:
Ciudad ciu;
Una vez declarada la variable es posible crear un objeto ligado a la
variable, siendo el objeto es una instancia de la clase Ciudad:
ciu = new Ciudad(8000);
Variables en Java (IV)
La creación (emplear new con el correspondiente constructor)
reserva espacio de almacenamiento en memoria para mantener el
estado interno del objeto.
Del mismo modo, la instrucción ciu = new Ciudad(8000);
provoca se ha visto tres efectos:
Ocupa memoria para mantener el estado interno del objeto de
acuerdo a la estructura determinada por la clase Ciudad.
Invoca al constructor de la clase para inicializar el estado interno
mantenido en los atributos de instancia.
Liga el objeto creado a la variable ciu.
Variables en Java (V)
Una variable de un tipo elemental recibe valores a través de
asignaciones.
Una variable de un tipo clase está asociada a un objeto con un
estado interno mantenido en variables de instancias.
La representación interna de una variable en memoria es muy
diferente según dicha variable esté asociada a un valor de un tipo
elemental o a un objeto de una clase.
Una variable de un tipo elemental puede aparecer en cualquier
expresión en la que se apliquen operadores con los cuales este tipo sea
compatible.
Una variable de un tipo clase puede usarse para enviar un
mensaje al objeto, en respuesta a este mensaje el objeto ejecutará un
método determinado por la clase a la que pertenece. Ejemplo:
if (ciu.densidad() > 0)
Variables en Java (VI)
Ciudad ciu1,ciu2;
ciu1=new Ciudad(7560,2300,45.5);
ciu2=new Ciudad(7560,2300,45.5);
if (ciu1 == ciu2)
Falso
codigoPostal 7560 codigoPostal 7560
ciu1 poblacion 2300 ciu2 poblacion 2300
superficie 45,5 superficie 45,5
Los valores de las variables son referencias, por lo que la
comparación se realiza en base a dichas referencias.
Puesto que objetos diferentes (pudiendo tener contenidos
iguales o no) están alojados en posiciones de memoria diferente, la
comparación de los mismos siempre proporciona una desigualdad como
resultado de su comparación.
Variables en Java (VII)
Es importante distinguir entre el nombre de un objeto, el
objeto mismo y el objeto del problema que representa.
Un mismo objeto puede tener dos nombres diferentes y
también es posible que dos objetos diferentes, con diferentes nombres,
representen a un mismo objeto del problema. Bajo estas circunstancias,
¿cómo decidimos si dos objetos son iguales?
Ciudad ciu1,ciu2;
ciu1=new Ciudad(7560,2300,45.5);
ciu2=ciu1;
if (ciu1 == ciu2)
Verdadero
ciu1 codigoPostal 7560
poblacion 2300
ciu2
superficie 45,5
Variables en Java (VIII)
Ejemplo de dos objetos con el mismo estado interno:
codigoPostal 7560 codigoPostal 7560
ciu1 poblacion 2300 ciu2 poblacion 2300
superficie 45,5 superficie 45,5
Ejemplo de un mismo objeto referenciado por dos variables:
ciu1 codigoPostal 7560
poblacion 2300
ciu2
superficie 45,5
Variables en Java (IX)
Ciudad ciu1,ciu2;
ciu1=new Ciudad(7560,2300,45.5);
ciu2=ciu1;
ciu1.aumentarPoblacion (120);
if (ciu1 == ciu2)
Verdadero
ciu1 codigoPostal 7560
poblacion 2420
ciu2
superficie 45,5
ciu1 y ciu2 tienen la misma identidad porque referencian a un mismo
objeto.
Variables en Java (X)
private int codigoPostal;
private int poblacion;
private float superficie;
public boolean equals (Ciudad otra)
{
return codigoPostal==otra.obtenerCodigoPostal()
&& poblacion==otra.obtenerPoblacion()&&
superficie == otra.obtenerSuperficie();
}
Ciudad ciu1,ciu2;
ciu1=new Ciudad(7560,2300,45.5);
ciu2=new Ciudad(7560,2300,45.5);
if (ciu1.equals(ciu2))
Verdadero