Tipos primitivos, referencias y expresiones LSUB GSYC 23 de enero de 2013 (cc) 2013 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: • 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. • Ser 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 • boolean, Literal: true,false wrapper : Boolean • char, 2 bytes (Unicode), Literal: ’a’ wrapper : Character • byte, 1 byte con signo, Literal: 44 wrapper : Byte • short 2 bytes con signo, Literal: 44 wrapper : Short • int, 4 bytes con signo, Literal: 44 wrapper : Integer • long, , 8 bytes con signo, Literal: 52332L wrapper : Long • float, 4 bytes con signo, Literal: 534.23F wrapper : Float • double, 8 bytes con signo, Literal: 32.34, 345.435D wrapper : Double • void wrapper : Void Autoboxing Desde Java SE5 se pueden asignar variables de tipos primitivos a una referencia de su clase wrapper correspondiente. char c ; C h a r a c t e r r c = new C h a r a c t e r ( ’ ’ ) ; rc = c ; Tipos primitivos Siempre debemos inicializar las variables y miembros de clase. En Java, sólo los miembros de clase tienen valores por omisión: • • • • • • • • boolean: false char: null byte: (byte)0 short: (short)0 int: 0 long: 0L float: 0.0F double: 0.0D Casting Podemos convertir tipos de forma explı́cita (casting): int x = 3; byte b = ( byte ) x ; En algunos casos se convierte de forma implı́cita (cuando el destino es mayor que el origen): • float ← int • short ← byte • int ← byte • int ← short • long ← int • double ← float Más detalles sobre tipos • ¡Cuidado con los desbordamientos! • De número real a número entero, se trunca. Si quieres redondear, necesitas usar el método Math.round. • El resultado de una operación aritmética o bit a bit sobre un numérico menor que int (e.g. short o byte) promociona a int. Autoboxing 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 ; Constantes • Se definen como un atributo de clase final. • No debemos tener números mágicos en el código. f i n a l i n t MAX CLIENTS = 3 2 ; Referencias • Son punteros. • Si asignas una referencia a otra, las dos apuntan al mismo objeto. • Si queremos tener dos referencias que apunten a dos objetos similares, tendremos que hacer una copia. 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 ( ) ; 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 ) ; Ámbito • El ámbito determina la visibilidad y vida de un identificador. • El bloque en el que está declarado el identificador, determinado por { y }, es el que establece su ámbito. • En Java no se permite ocultar variables locales (¡pero nunca deberı́amos ocultar!). • Mientras que una instancia esté referenciada y la referencia sea visible, la instancia es visible. • Cuando la cuenta de referencias de una instancia llega a 0, esto es, ningún elemento la referencia, se destruye (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 == != & ˆ | && || ? : = += −= ∗= /= %= &= ˆ= |= <<= >>= >>>= Comparando objetos • ¡Cuidado con comparar referencias! • 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 ) ; Comparaciones lógicas • 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 ( ” hey ! ” ) ; }