Variables y Tipos
Una variable se declara usando la misma sintaxis de C. Por ejemplo la siguiente tabla indica una declaración, el nombre de la variable introducida y el tipo de información que almacena la variable
Java posee dos grandes categorías de tipos para las variables:
int almacena un valor entero como 1, 2, 0, -1, etc.
Las variables de tipos primitivos almacenan directamente un valor que siempre pertenece al rango de ese tipo. Por ejemplo una variable
Esto significa que al asignar una variable entera a otra variable entera, se copia el valor de la primera en el espacio que ocupa la segunda variable.
Las variables de tipo referencia a objetos en cambio almacenan direcciones y no valores directamente. Una referencia a un objeto es la dirección de un área en memoria destinada a representar ese objeto. El área de memoria se solicita con el operador new.
Al asignar una variable de tipo referencia a objeto a otra variable se asigna la dirección y no el objeto referenciado por esa dirección. Esto significa que ambas variables quedan refenciando el mismo objeto.
La diferencia entre ambas asignaciones se observa en la siguiente figura:
Esto tiene implicancias mayores ya que si se modifica el objeto referenciado por r, entonces también se modifica el objeto referenciado por s, puesto que son el mismo objeto.
En Java una variable no puede almacenar directamente un objeto, como ocurre en C y C++.
Por lo tanto cuando se dice en Java que una variable es un string, lo que se quiere decir en realidad es que la variable es una referencia a un string.
Se dice que un tipo A es de mayor rango que un tipo B si A es un superconjunto de B. Esto quiere decir que las variales de tipo B siempre se pueden asignar a variables de tipo A (eventualmente con pérdida de significancia).
Por ejemplo int es de mayor rango que short, que a su vez es de mayor rango que byte. Float y double son de mayor rango que int. Double es de mayor rango que float.
Esto se puede resumir en:
Expresiones
En Java cada expresión tiene un tipo que se determina durante
la compilación, es decir es independiente del valor durante la ejecución.
Una expresión puede ser:
El resultado de estas operaciones es siempre del mismo tipo del operando.
Si el operando es byte o short entonces se convierte a int, se realiza la operación y el resultado es un int.
El resultado de estas operaciones es siempre del mismo tipo del operando.
- Una constante: 1, 1.0, true, etc.
El tipo de esta expresión es el tipo de la constante. En el ejemplo los tipos son int, double y boolean respectivamente. - Una variable: i, s, a
El tipo de esta expresión es el tipo con que se declaró aquella variable. En el ejemplo los tipos son entero, referencia a string y referencia a arreglo. - El resultado de una operación: i+1, a[1], etc.
El tipo se determina en función de los tipos de las expresiones que se indican como argumentos de la operación.
- Al operar con byte y short, estos se convierten implícitamente a int.
- Cuando los tipos de los operandos no coinciden, el operando de menor rango se convierte implícitamente al tipo de mayor rango. El resultado de la operación es del tipo de mayor rango.
El resultado de estas operaciones es siempre del mismo tipo del operando.
Si el operando es byte o short entonces se convierte a int, se realiza la operación y el resultado es un int.
El resultado de estas operaciones es siempre del mismo tipo del operando.
Ejemplos:
int a=1, b=2;
int c= +a;
int d= -(c+1);
b= a++; // b= 1, a=2
a= --b; // a=b= 0
(a+1)++; // error a+1 no es una variable
float f= a; f++; // error f no es entero
Los operandos y el resultado de estos operadores son siempre booleanos.
Los operadores && y || evalúan la expresión del lado derecho sólo si es necesario.
Ejemplos:
int a=1, b=2;
boolean v= ! a<=b && a==5 || b!=4;
boolean w= ((! a<=b) && a==5) || b!=4;
boolean w2= a<=b && a; // error a no es boolean
Conversiones: cast
int a=1, b=2;
int c= +a;
int d= -(c+1);
b= a++; // b= 1, a=2
a= --b; // a=b= 0
(a+1)++; // error a+1 no es una variable
float f= a; f++; // error f no es entero
Los operandos y el resultado de estos operadores son siempre booleanos.
Los operadores && y || evalúan la expresión del lado derecho sólo si es necesario.
Ejemplos:
int a=1, b=2;
boolean v= ! a<=b && a==5 || b!=4;
boolean w= ((! a<=b) && a==5) || b!=4;
boolean w2= a<=b && a; // error a no es boolean
Conversiones: cast
- Java realiza conversiones implícitas de menor a mayor rango.
- Eventualmente hay pérdida de significacia al convertir enteros a punto flotante.
- Todas las conversiones de mayor a menor rango deben ser
explícitas por medio del operador de cast:
(tipo)expresión
int i= 1;
short s= 2;
int j= i+s;
s= a; // error short < int
s= (short)a; // Ok
i= 1.0; // error int < double
i= (int)1.0; // Ok
f= 1.0; // error float < double
f= (float)1.0; // Ok
f= 1.0f; // Ok boolean v=(boolean)a; // error no existe conversión
No hay comentarios:
Publicar un comentario