Tipos primitivos, referencias y expresiones

Anuncio
Tipos primitivos, referencias y expresiones
LSUB
GSYC
9 de febrero de 2016
(cc) 2014 Laboratorio de Sistemas,
Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Reconocimiento NoComercial - SinObraDerivada (by-nc-nd). Para obtener la licencia completa, véase
http://creativecommons.org/licenses/by-sa/2.1/es. También puede solicitarse a Creative Commons, 559 Nathan
Abbott Way, Stanford, California 94305, USA.
Tipos en Java
Una variable puede:
I
Ser una referencia a una instancia de una clase, esto es, una
referencia a un objeto de una clase dada. Todos los objetos se
encuentran en el heap.
I
Ser un valor de un tipo primitivo, por tanto, no es una
referencia a una instancia de una clase, sino que alberga
directamente un valor.
Declaración y asignación
char c ; // d e c l a r a c i o n
char k = ’ x ’ ; // d e c l a r a c i o n con i n i c i a l i z a c i o n
c = k ; // a s i g n a c i o n
La asignación evalúa al valor asignado.
Tipos primitivos
I boolean, Literal: true,false
wrapper : Boolean
I char, 2 bytes (Unicode), Literal: ’a’
wrapper : Character
I byte, 1 byte con signo, Literal: 44
wrapper : Byte
I short 2 bytes con signo, Literal: 44
wrapper : Short
I int, 4 bytes con signo, Literal: 44
wrapper : Integer
I long, , 8 bytes con signo, Literal: 52332L
wrapper : Long
I float, 4 bytes con signo, Literal: 534.23F
wrapper : Float
I double, 8 bytes con signo, Literal: 32.34, 345.435D
wrapper : Double
I void (para los métodos que no retornan valor)
wrapper : Void
Autoboxing
Desde Java SE5 se pueden asignar variables de tipos primitivos a
una referencia de su clase wrapper correspondiente.
char c = ’ x ’ ;
C h a r a c t e r ch = new C h a r a c t e r ( ’ x ’ ) ;
c = ch ;
ch = c ;
Tipos primitivos
Recuerda: Siempre debemos inicializar las variables. Una clase no
compila si hay variables locales sin inicializar. A los atributos se les
asignan valores por omisión:
I boolean: false
I char: null
I byte: (byte)0
I short: (short)0
I int: 0
I long: 0L
I float: 0.0F
I double: 0.0D
Casting
Podemos convertir tipos de forma explı́cita (casting):
int x = 3;
byte b = ( byte ) x ;
La asignación anterior, sin casting, no compila (de tipo más grande
a tipo más pequeño). En algunos casos se convierte de forma
implı́cita (cuando el destino es mayor que el origen), por ejemplo:
I
float ← int
I
short ← byte
I
int ← byte
I
int ← short
I
long ← int
I
double ← float
Más detalles sobre tipos
I
¡Cuidado con los desbordamientos!
I
De número real a número entero, se trunca. Si quieres
redondear, necesitas usar el método Math.round.
I
El resultado de una operación aritmética o bit a bit sobre un
numérico menor que int (p.ej. short o byte) promociona a
int:
byte i = 28;
System . o u t . p r i n t l n ( ( O b j e c t ) ( i +3) i n s t a n c e o f By te ) ;
System . o u t . p r i n t l n ( ( O b j e c t ) ( i +3) i n s t a n c e o f I n t e g e r ) ;
// s a l i d a :
// f a l s e
// t r u e
Constantes
I
Se definen como un atributo de clase final.
I
Como siempre: NO debemos tener números mágicos en el
código.
f i n a l i n t MAX CLIENTS = 3 2 ;
Referencias
I
Son “punteros”.
I
Si asignas una referencia a otra, las dos apuntan al mismo
objeto.
I
Si queremos tener dos referencias que apunten a dos objetos
similares, tendremos que hacer una copia.
I
P. ej. algunas clases se pueden duplicar mediante el método
clone() (tienen que ser Cloneable).
Referencias
Date d1 = new Date ( 1 3 5 8 3 3 5 9 3 7 L ∗1000 L ) ;
Date d2 = d1 ;
Date d3 = ( Date ) d1 . c l o n e ( ) ; // o j o con c l o n e !
d3 . s e t T i m e ( 0 L ) ;
System . o u t . p r i n t l n ( d1 ) ;
System . o u t . p r i n t l n ( d2 ) ;
System . o u t . p r i n t l n ( d3 ) ;
// La s a l i d a e s :
//Wed Jan 16 1 2 : 3 2 : 1 7 CET 2013
//Wed Jan 16 1 2 : 3 2 : 1 7 CET 2013
//Thu Jan 01 0 1 : 0 0 : 0 0 CET 1970
Ámbito
I
El ámbito determina la visibilidad y vida de un identificador.
I
El bloque en el que está declarado el identificador,
determinado por { y }, es el que establece su ámbito.
I
En Java no se permite ocultar variables locales (¡nunca
deberı́amos ocultar de todas formas!).
I
Mientras que una instancia esté referenciada y la referencia
sea visible, la instancia es visible.
I
Cuando la cuenta de referencias de una instancia llega a 0,
esto es, ningún elemento la referencia, el objeto pasa a ser
recolectable y en algún momento se destruirá (recolección de
basura).
Operadores
Precedencia de operadores (primero los de mayor precedencia):
e x p r++ e x p r −−
++e x p r −−e x p r +e x p r −e x p r ˜ !
∗ / %
+−
<< >> >>>
< > <= >= i n s t a n c e o f
== !=
&
ˆ
|
&&
||
? :
= += −= ∗= /= %= &= ˆ= |= <<= >>= >>>=
Nota:
>> es el desplazamiento aritmético, con signo.
>>> es el desplazamiento lógico, sin signo.
Comparando objetos
I
¡Cuidado con comparar referencias!
I
Se usa el método equals para comparar dos objetos.
Date d1 = new Date ( 1 3 5 8 3 3 5 9 3 7 L ∗ 1000 L ) ;
Date d3 = new Date ( 1 3 5 8 3 3 5 9 3 7 L ∗ 1000 L ) ;
System . o u t . p r i n t l n ( d3 . e q u a l s ( d1 ) ) ;
System . o u t . p r i n t l n ( d3 == d1 ) ;
Expresiones lógicas
I
En Java se cortocircuita la evaluación de expresiones lógicas.
Date d1 = new Date ( 1 3 5 8 3 3 5 9 3 7 L ∗ 1000 L ) ;
Date d3 = n u l l ;
i f ( d1 != n u l l | | d3 . e q u a l s ( d1 ) ) {
System . o u t . p r i n t l n ( ” h e y ! ” ) ;
}
// t h i s c o d e p r i n t s ” h e y ! ” and t h e n u l l p o i n t e r
// e x c e p t i o n i s n o t r a i s e d .
Descargar