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 .