Optimizando el uso de la clase Number cómo Wrapper de números.

Por descargarpseint / hace 5 meses / 0 Comentarios ».

Hoy quiero hablarte de herencia en java. Para ello te planteare una serie de ejercicios utilizando enteros y reales, utilizando tipos primitivos, clases envoltorio (wrappers) y también verás toda la potencia de las clases abstractas en java con el uso de la clase Number. Una vez hayas terminado este capítulo doble espero que dispongas de los conocimientos necesarios para programar adecuadamente la interfaz Calculadora.

Ejercicio 1: Crea un nuevo proyecto java utilizando el entorno de desarrollo Eclipse.

Si no sabes como hacerlo entonces debes comenzar por aquí. Es muy importante que configures el proyecto para que compile y ejecute las clases utilizando la versión 4 del lenguaje, es decir, java 4.

Ejercicio 2: Crea una clase llamada HerenciaConNumber dentro del proyecto que acabas de crear.

Si necesitas un poco de ayuda puedes encontrarla aquí.

Ejercicio 3: Vas a definir un método privado (utilizando la palabra reservada private) llamado trabajandoConTiposPrimitivos(). Y dentro de el vas a programar las siguientes líneas.

int entero = 10;

long enteroLargo = 10; 

enteroLargo = entero;

entero = enteroLargo; 

entero = (int)enteroLargo;

Espero que estés programando, una a una, cada línea de código. Yo acabo de hacerlo y te puedo asegurar que siguiendo esta forma de trabajar conseguirás mejores resultados que copiando y pegando código.

Las dos primeras instrucciones que has programado son para declarar dos variables que te van a servir para el resto del ejercicio.

En la tercera linea estamos asignando a la variable entera larga el valor de la variable entera. El resultado es correcto. Una variable que almacena enteros de 64 bits puede almacenar también enteros de 32 bits.

Sin embargo, si haces la asignación inversa entonces eclipse nos avisa de que se ha producido un error de compilación. ¿Qué nos está queriendo decir eclipse?. Pues que una variable entera de 32 bits solo puede almacenar números de 32 bits. En el ejemplo el valor que pretendes asignarle es el 10, el cual, es un número que se podría representar con 32 bits, sin embargo, al proceder de una variable que guarda enteros de 64 bits (tipo long) el compilador de Java 4 no lo sabe y para evitar un posible desbordamiento lanza este error. Este es uno de los múltiples casos por los cuales java se considera un lenguaje de tipado fuerte.

La última línea del código que has programado en este ejercicio intenta realizar la misma asignación. En este caso ha desaparecido el error gracias a realizar un cast explicito de entero largo a entero de 32 bits.  Es decir, le has dicho al compilador que estás seguro que la variable enteroLargo contendrá un valor que se puede codificar con 32 bits.

float real = 10.8f;

 enteroLargo = real;

enteroLargo = (long)real;

Estas son las siguientes tres líneas que te propongo que programes. Aquí vas a intentar asignar un real de 32 bits a un entero largo de 64 bits. Habrás visto que Eclipse te está indicando que no es posible y la razón es la misma que en el caso anterior. El cast explicito de float a long si funciona, sin embargo, si ejecutas este trozo de código podrás comprobar que se pierde información durante la asignación.

Para terminar el ejercicio te voy a plantear un problema que, bajo mi punto de vista, es la razón fundamental por la cual se crearon las clases envoltorio (wrappers). Poder utilizar las clases de tipo colección (listas, mapas y arboles).

Voy a mostrarte la problemática planteándote el siguiente requisito. Intenta crear una lista de números que almacene las tres variables que hemos definido: entero, enteroLargo y real.

//Vamos a crear una lista de numeros.

List listaDeNumeros = new ArrayList(); 

listaDeNumeros.add(entero);

listaDeNumeros.add(enteroLargo);

listaDeNumeros.add(real);

En este trozo de código vas a trabajar con un tipo de datos muy utilizado en java, las listas. Quizás te preguntes como es posible asignar a una variable de tipo List un objeto de tipo ArrayList. Porque List es un interfaz y ArrayList es una clase que implementa dicho interfaz. (Ya viste que era un interfaz en el artículo anterior y en próximos artículos verás como puedes programar varias clases que implementen el interfaz Calculadora).

En las siguientes tres líneas vas a intentar añadir elementos a la lista utilizando el método add. Si revisas su signatura podrás ver que este método espera un parámetro de tipo Object. Esto quiere decir que acepta cualquier clase que herede de Object. En el mecanismo de herencia en java, todas  las clases heredan de Object, sin embargo, los tipos primitivos no son clases y por ello este código no ha superado la fase de compilación.

¿Cómo se podrían crear listas de números en java?. Utilizando las clases envoltorio (wrappers) Integer, Long y Float.

Ejercicio 4: Ahora vas a crear otro método privado llamado trabajandoConWrappers() y dentro de el vas a programar las siguientes líneas.

Integer entero = new Integer(10);

Long enteroLargo = new Long(10);

Float real = new Float(10.8f); 

//Vamos a crear una lista de numeros. 

List listaDeNumeros = new ArrayList();

listaDeNumeros.add(entero);

listaDeNumeros.add(enteroLargo);

listaDeNumeros.add(real);

En las tres primeras líneas vas a declarar variables de tipos envoltorio. Una para envolver un entero de 32 bits, una segunda para envolver a un entero largo de 64 bits y finalmente una tercera para envolver un número real de 32 bits.

En el segundo bloque de código estás creando y metiendo elementos en la lista de números. Una vez lo programes en tu IDE comprobarás que funciona correctamente ya que las clases envoltorio extienden de la clase Object y por lo tanto son aceptadas por el método add.

En Java una variable instancia de un tipo clase puede aceptar instancias de clases que hereden de dicha clase, es decir, sean clases hija. Esto quiere decir que como todas las clases heredan de Object entonces una variable de tipo Object acepta cualquier objecto de cualquier clase.

Nos quedaba pendiente resolver un par de problemas que te muestro a continuación.

enteroLargo = entero;

entero = enteroLargo;

entero = (Integer)enteroLargo;

enteroLargo = real;

enteroLargo = (Float)real;

Si programas estas cinco líneas de código podrás comprobar que todas ellas son erróneas. ¿Qué está ocurriendo?, pues que has intentado realizar asignaciones entre variables cuyos tipos no tienen una relación de herencia entre si. Y, ¿por qué fallan los cast explícitos?. Exactamente por lo mismo, cuando hablamos de clases el cast explicito funciona cuando lo realizamos desde una clase padre (ejemplo, Object) a una clase hija (ejemplo, Integer).

La solución tiene que ver con la clase Number y te la presentaré dentro de 7 días. Mientras tanto puedes intentar resolver el problema por tu cuenta y enviarme tus dudas poniéndote en contacto conmigo.

Hasta aquí esta primera entrega de este capítulo. Espero que te haya servido para mejorar tus aptitudes a la hora de programar en java. Si quieres mantenerte informado de las actualizaciones del tutorial Tutorial en Java Programando una Calculadora paso a paso  o del contenido, en general, de la web puedes hacerlo cómodamente desde aquí.

Ver: descargar Pseint portable

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *