You are on page 1of 11

2-Tipos y alcance de variables. Casting. Estructuras de programacin.

Clases envoltorio
Concepto de variable
Una variable es un contenedor de bits que representan a un valor. Se emplean para almacenar datos que pueden cambiar durante la ejecucin de un programa. En funcin de los datos que almacenan se clasifican en:

Variables primitivas: almacenan datos numricos, valores lgicos o caracteres. Variables referenciadas: asociadas a objetos o instancias de una clase. Por ejemplo, para almacenar cadenas de caracteres se emplear una variable referenciada asociada a la clase String, para almacenar informacin sobre la fecha actual, otra asociada a la clase Date, etc. Se estudiarn ms adelante.

Adems de estos dos tipos de variables se estudiarn los arrays de variables primitivas y de variables referenciadas. Un array, como se ver en el tema correspondiente, es una variable referenciada asociada a la clase Object (clase madre de todos los objetos Java). Se va a profundizar un poco ms en el concepto de variable: como se ha comentado anteriormente, no es nada ms que un contenedor de bits que representan a un valor. Ocurre lo siguiente:

En el caso de variables primitivas, los bits representan un nmero entero que coincide con el valor de la variable, con lo que se va a trabajar a lo largo del programa. Por ejemplo, se tienen variables de tipo byte (utilizan 8 bits en memoria) que pueden almacenar nmeros enteros comprendidos entre -128 y 127, de tipo int (utilizan 32 bits en memoria) para almacenar enteros entre, aproximadamente, -2150 millones y 2150 millones, de tipo float para nmeros decimales, etc.

En el caso de variables referenciadas o asociadas a objetos, los bits representan un numerajo que permite acceder al valor de la variable, es decir, al objeto, pero no es el valor u objeto en s.

Todos los nombres empleados para hacer referencia a variables deben cumplir lo siguiente:

Su primer carcter debe ser una letra, el smbolo del subrayado o el carcter dlar $. No son vlidos las palabras reservadas de Java. No se admiten espacios en blanco. Son case-sensitive (sensibles a maysculas).

Aparte de estas normas conviene que los nombres de las variables indiquen qu dato almacenan

con el fin de facilitar la lectura del programa y, por otra parte, si un nombre tiene ms de dos palabras la primera letra de la primera palabra ir en minscula, la primera letra de la segunda palabra en mayscula, dem con la tercera y as sucesivamente. Ejemplo: int miVariableEntera=100;

Variables primitivas

De tipo entero:
Son variables que almacenan nmeros enteros. Se pueden dividir en los siguientes tipos:

NOTA: el tipo de variable en que se almacena por defecto un numero entero es int. El valor por defecto asociado a cualquier variable entera no inicializada es 0.

De tipo real o de coma flotante:


Son variables que almacenan datos numricos con decimales. Se pueden dividir en los siguientes tipos:

NOTA: el tipo de variable en que se almacena por defecto un numero decimal es double. El valor por defecto asociado a cualquier variable real no inicializada es 0.0.

De tipo lgico o booleanas:


Son variables que almacenan dos posibles valores: true o false. No se corresponden con ningn valor numrico. Ejemplo: boolean tienesCalor=true;

NOTA: el valor por defecto asociado a cualquier variable booleana no inicializada es false.

De tipo char o de carcter:


Son variables que almacenan caracteres individuales (letra, numero, signo ?, etc...). El carcter que se inicializa debe ir entre apstrofes o comillas simples 'a'. El cdigo de caracteres empleado por Java es Unicode y recoge los caracteres de prcticamente todos los idiomas importantes del mundo (son unos 65.536). Los caracteres Unicode del alfabeto occidental corresponden a los primeros 256 enteros; es decir van desde [0, 255]. A cada carcter le corresponde unvocamente un nmero entero perteneciente al intervalo [0, 65536] o a [0, 255] si se trabaja slo con el alfabeto occidental. Por ejemplo, la letra es el entero 164. Ms adelante se ver que el casting entre variables primitivas enteras y la variable char est permitido. Ejemplo: char miCaracter='n'; char miCaracter1=110; (dem antes, pero mediante el entero que le corresponde segn Unicode) char miCaracter2='\u006E'; (dem antes, pero segn notacin Unicode. La notacin Unicode, en general, es as: \uXXXX siendo X un dgito o cifra fundamental del sistema de numeracin hexadecimal (0,1,2,...,9,A,B,...,F)) Asociado a este tipo de variable se tienen las secuencias de escape. Se emplean para representar caracteres especiales (por ejemplo, unas comillas dentro de una instruccin que exige una cadena entrecomillada) y caracteres no imprimibles como el tabulador, salto de lnea, etc. Van precedidos de la contrabarra. Algunos de ellos se detallan en la tabla siguiente:

NOTA: el valor por defecto asociado a cualquier variable char no inicializada es '\u0000' Ejemplo: todos los c:\cursojava\tema2 cdigos de este tema se guardarn en

Cdigo fuente Por consola: Comienza programa

El valor de tengoCalor es true El valor El valor El valor Eso es un mensaje de tres lineas Me llamo "Jesus" de letra es n de letra1 es n de letra2 es n

Me llamo \Jesus\

Variables referenciadas
Asociadas a objetos o instancias de una clase. Se irn estudiando durante el curso.

Casting o transformaciones de tipo


El casting es un procedimiento para transformar una variable primitiva de un tipo a otro, o transformar un objeto de una clase a otra clase siempre y cuando haya una relacin de herencia entre ambas (este ltimo casting es el ms importante y se ver ms adelante). Dentro del casting de variables primitivas se distinguen dos clases:

Implcito: no se necesita escribir cdigo para que se lleve a cabo. Ocurre cuando se realiza una conversin ancha (widening casting), es decir, cuando se coloca un valor pequeo en un contenedor grande.
Ejemplo 1:

Ejemplo 2: similar al anterior.

En cambio,

Explcito: s es necesario escribir cdigo. Ocurre cuando se realiza una conversin estrecha (narrowing casting), es decir, cuando se coloca un valor grande en un contenedor pequeo. Son susceptibles de prdida de datos.
Ejemplo 1:

NOTA: si se sustituyera la primera lnea int num1=100 por int num1=1000000, el cdigo compilara bien, pero prdida de datos, pues el 1000000 se sale del rango de short [-32768, 32767]. Al mostrar por consola el valor s obtendra un resultado incongruente.

Ejemplo 2:

Ejemplo 3: continuacin del Ejemplo 2 del casting implcito Para que la lnea

compile debe hacerse un casting explcito a long

pero no

porque, en la lnea anterior, 10000000000 es considerado int, mientras que en las de arriba, double. Dicho esto, se va a analizar un ejemplo un tanto extrao. Ejemplo extrao:

Dado que cualquier entero, por defecto, se almacena en un int (4 bytes), con la lnea anterior se pretende colocar un valor grande (el int 10) en un contenedor pequeo (una primitiva de tipo byte con capacidad para 1 byte). Esto, segn lo expuesto anteriormente, precisa de casting explcito.

Pero, resulta que no hace falta, ya que el compilador, cuando se trabaja con enteros, digamos que, provoca un "casting implcito contranatura" y transforma automticamente a byte el int 10. Ocurrira lo mismo si se trabajara con short y char. Lo que pasa (y esto es lo que resulta un tanto extrao) es que no ocurre lo anterior con los decimales: por eso, una lnea como

provoca error de compilacin. Recordar que cualquier decimal, por defecto, se almacena en un double (8 bytes) y que un tipo float tiene capacidad para 4 bytes. En los decimales, el compilador no fuerza el casting implcito contranatura. De ah que sea necesario un casting explcito a float

para evitar el fallo de compilacin. NOTA: quiz se evitaran estas situaciones, si el compilador no forzara el casting implcito contranatura a byte, short o char de un int y provocara error de compilacin, del mismo modo que cuando se declara un float y no se castea explcitamente. Pero, de momento, esto es lo que hay. Cdigo de partida para explicar el casting entre variables primitivas que almacenan datos numricos:

Las lneas 3 y 4 almacenan al nmero 10 mediante una variable primitiva de tipo byte va "casting implcito contranatura", el 3000 mediante una de tipo short, tambin va "casting implcito contranatura". Lo ms intuitivo es definirlas mediante un casting explcito, pero tal y como estn tambin se puede. Supuestamente, la lnea 5, almacena el 3000000000 mediante una variable de tipo long, va casting implcito, pero es falso. Ocurre lo que se ha comentado en el Ejemplo 2 del casting implcito: 3000000000 no es considerado como long sino como int y 3000 millones no pertenece al rango asociado a int (aprox. [-2150 millones, 2150 millones]). Si se intenta compilar, se producira error. Supuestamente, la lnea 6, almacena el 256.5 mediante una variable de tipo float (ocupa 4 bytes en memoria), va "casting implcito contranatura", pero, como se ha comentado en el Ejemplo extrao, es falso, ya que en decimales nunca se produce. Debe castearse explcitamente a float. El cdigo correcto sera:

Cdigo fuente

Una cuestin a tener en cuenta relacionada con el casting entre variables primitivas es la siguiente:

En Java se realizan automticamente conversiones de una variable primitiva de un tipo a otra de otro de igual o mayor precisin. La precisin depende del nmero de bytes ocupados en memoria y del rango de valores asociado: a mayor nmero de bytes ocupados, mayor precisin y mayor rango asociado. As, pasar de byte a short, de short a int, de byte a int, . es automtico; en definitiva: pasar de una variable primitiva de un tipo de la cadena de la siguiente lnea a otra que se encuentre a su derecha es automtico. byte-->short-->int-->long-->float-->double As, por ejemplo, si un mtodo necesita un long como argumento y se le pasa un entero perteneciente al rango de int, promociona automticamente a long y no es necesario casting. En cambio, si se le pasa un entero que se sale fuera del rango de int, es necesario realizar un casting para que la llamada al mtodo no provoque error al compilar. Un ejemplo de esto ocurre con el mtodo esttico de java.lang.Thread "void sleep(long retardo)" que introduce un retardo en la ejecucin del cdigo, coincidente con el entero, en milisegundos, que se le pasa al argumento. Este mtodo se estudiar ms adelante.

Por consola: Hola -- Despus de tres segundos -Adios En cambio, si se sustituye Thread.sleep(3000) por Thread.sleep(3000000000) no compila ya que el entero que se le pasa no pertenece al rango de int y no puede promocionar a long automticamente. Para que compile es necesario hacer un casting explcito: Thread.sleep(3000000000L)

Para finalizar con el casting entre primitivas, conviene tener en cuenta lo siguiente:

No es posible realizar casting entre una variable primitiva booleana y cualquier otra variable primitiva. S es posible realizar casting entre una variable primitiva char y una variable primitiva que almacene enteros.

Ejemplo:

Cdigo fuente

Por consola:
Todos los derechos reservados Copyright 2004 ADR Infor S.L. Contacto: soporte@adrinfor.com

You might also like