¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. JAVA 8
  3. Programación orientada a objetos
Extrait - JAVA 8 Los fundamentos del lenguaje Java (con ejercicios prácticos corregidos)
Extractos del libro
JAVA 8 Los fundamentos del lenguaje Java (con ejercicios prácticos corregidos) Volver a la página de compra del libro

Programación orientada a objetos

Introducción

Con Java, la noción de objeto es omnipresente y precisa un mínimo de aprendizaje. En primer lugar, nos centraremos en los principios de la programación orientada a objetos y en su vocabulario asociado, para pasar luego a ponerlo todo en práctica con Java.

En un lenguaje procedural clásico, el funcionamiento de una aplicación está regido por una sucesión de llamadas a diferentes procedimientos y funciones disponibles en el código. Estos procedimientos y funciones son los encargados de procesar los datos de la aplicación representados por las variables de esta última. No existe relación alguna entre los datos y el código que los manipula. Por el contrario, en un lenguaje orientado a objetos, vamos a intentar agrupar el código. A esta agrupación se le llama clase. Por lo tanto, una aplicación desarrollada con un lenguaje orientado a objetos está formada por numerosas clases que representan los diferentes elementos procesados por la aplicación. Las clases describirán las características de cada uno de los elementos. El ensamblado de estos elementos va a permitir el funcionamiento de la aplicación.

Este principio se utiliza ampliamente en otras disciplinas además de la informática. En la industria automovilística, por ejemplo, seguramente no existe ningún constructor que disponga...

Puesta en práctica con Java

En el resto del capítulo, vamos a trabajar con la clase Persona, cuya representación UML ( Unified Modeling Language ) es la siguiente.

images/diagClasse.png

UML es un lenguaje gráfico destinado a la representación de los conceptos de programación orientada a objetos. Para obtener más información sobre este lenguaje, puede consultar el manual UML 2 en la colección Recursos Informáticos de Ediciones ENI.

1. Creación de una clase

La creación de una clase consiste en su declaración y la de todos los elementos que la componen.

a. Declaración de la clase

La declaración de una clase se lleva a cabo utilizando la palabra clave class seguida del nombre de la clase y de un bloque de código delimitado por los caracteres { y } (llaves). En este bloque de código se encuentran las declaraciones de variables, que serán los campos de la clase, y las funciones, que serán los métodos de la clase. Se pueden añadir varias palabras clave para modificar las características de la clase. Por lo tanto, la sintaxis de la declaración de una clase es la siguiente.


[lista de modificadores] class NombreDeLaClase [extends 
NombreDeLaClaseBasica] 
             [implements NombreDeInterfaz1,NombreDeInterfaz2,...] 
{ 
     Código de la clase 
}
 

Los signos [ y ] (corchetes) se utilizan para indicar qué elemento es opcional. No se deben utilizar en el código de declaración de una clase.

Los modificadores permiten determinar la visibilidad de la clase y cómo se utiliza. A continuación presentamos la lista de los modificadores disponibles:

public: indica que la clase puede ser utilizada por cualquier otra clase. Sin este modificador, la clase sólo podrán utilizarla clases que formen parte del mismo paquete.

abstract: indica que la clase es abstract...

Gestión de las excepciones

¡La vida de un desarrollador no es del todo fácil! Los errores son una de las fuentes principales de estrés. De hecho, si nos fijamos bien, podemos clasificar estos errores que nos arruinan la vida en tres categorías. Veremos cada una de ellas así como las soluciones existentes para resolverlos.

1. Los errores de sintaxis

Este tipo de errores se produce en tiempo de compilación cuando una palabra clave del lenguaje está mal ortografiada. Son habituales con las herramientas de desarrollo en las cuales el editor de código y el compilador son dos entidades separadas y menos frecuentes en entornos de desarrollo integrado (Eclipse, NetBeans, Jbuilder…). La mayoría de estos entornos proporcionan un análisis sintáctico al mismo tiempo que se escribe el código. Los siguientes ejemplos se han obtenido a partir del entorno Eclipse.

Si se detecta un error de sintaxis, el entorno propone soluciones que permiten corregir este error.

images/3fig15.PNG

Además, las "faltas de ortografía" en los nombres de campos o métodos se eliminan fácilmente mediante las funcionalidades disponibles en estos entornos.

images/3fig16.PNG

2. Los errores de ejecución

Estos errores aparecen después de la compilación cuando lanzamos la ejecución de la aplicación. La sintaxis del código es correcta, pero el entorno de la aplicación no permite ejecutar alguna instrucción empleada en la aplicación. Se da el caso, por ejemplo, si intenta abrir un archivo que no existe en el disco de su máquina. Sin duda, obtendrá un mensaje de este tipo.

images/3fig17.PNG

¡No es un mensaje muy simpático para el usuario!

Afortunadamente, Java nos permite recuperarnos de este tipo de errores y evita, así, la visualización de este mensaje preocupante. Vamos a detallar esto más adelante en este capítulo.

3. Les errores de lógica

Los peores enemigos de los desarrolladores. Todo se compila sin problema, todo se ejecuta sin errores, y sin embargo "¡¡¡no funciona como estaba previsto!!!"

En este caso, hay que revisar la lógica de funcionamiento de la aplicación. Las herramientas de depuración nos permiten seguir el desarrollo de la aplicación, situar puntos de interrupción, visualizar el contenido de las variables, etc.

Estas herramientas...

Las colecciones

Las aplicaciones necesitan, con frecuencia, manipular una gran cantidad de información. Existen numerosas estructuras que facilitan la gestión de dicha información. Se agrupan bajo el término "colección". Como ocurre en la vida, existen distintos tipos de colecciones y de coleccionadores. Puede haber personas que lo guardan todo pero que no tienen una organización particular para clasificarlo, otras que se especializan en la colección de ciertos tipos de objetos, o incluso los maníacos que toman todas las precauciones posibles para poder encontrar rápidamente un objeto…

El lenguaje Java proporciona distintas clases que permiten implementar varios modelos de gestión.

La primera solución para gestionar un conjunto de elementos consiste en utilizar tablas. Esta solución se ha descrito en la sección Los arrays del capítulo Fundamentos del lenguaje. Si bien son sencillas de implementar, esta solución no es demasiado flexible. Su principal defecto es el carácter fijo del tamaño de la tabla. Si no hay espacio para almacenar elementos suplementarios, hay que crear una nueva tabla, más grande, y transferirle el contenido de la tabla anterior. Esta solución, muy pesada de implementar, consume además muchos recursos.

El lenguaje Java proporciona una vasta paleta de interfaces y de clases que permiten gestionar, fácilmente, conjuntos de elementos. Las interfaces describen las funcionalidades disponibles mientras que las clases implementan y proveen, realmente, dichas funcionalidades. En función del modelo de gestión que se desee tener sobre los elementos, se utilizará la clase mejor adaptada. No obstante, las mismas funcionalidades básicas deben estar accesibles sea cual sea el modelo de gestión. Para asegurar la presencia de estas funcionalidades, indispensables en todas las clases, se han agrupado en la interfaz Collection, que se utiliza como interfaz básica.

La jerarquía de interfaces se presenta en el siguiente diagrama.

images/182-1.png

Todas estas interfaces son genéricas, con el objetivo de gestionar conjuntos compuestos por no importa qué tipos de elementos, evitando así las molestas operaciones de cambio de tipo.

Por cada una de estas interfaces existen una o varias clases asociadas. Son las que nos van a interesar.

1. La clase ArrayList...

Ejercicios

Ejercicio 1

Crear una clase que represente un artículo de una tienda de venta por correspondencia. Un artículo se caracteriza por su referencia, su nombre y su precio. Crear, a continuación, un método main que permita probar el correcto funcionamiento de la clase anterior.

Ejercicio 2

Agregar las dos clases Libro y Dvd que heredan de la clase Articulo.

Un libro posee un número ISBN, contiene cierto número de páginas y lo ha escrito un autor, un Dvd tiene cierta duración y lo ha producido un realizador.

Agregar los atributos necesarios a las clases Libro y Dvd para obtener el nombre del autor o del realizador. Probar, a continuación, el funcionamiento de estas dos nuevas clases.

Ejercicio 3

Modificar las clases Libro y Dvd para tener disponible información relativa al autor o el realizador:

  • su apellido

  • su nombre

  • su fecha de nacimiento

Pista: los autores y realizadores son personas.

Ejercicio 4

Modificar el código anterior para poder obtener rápidamente la lista de artículos relacionados con un autor o un realizador.

Correcciones

Corrección del ejercicio 1

La clase Articulo es relativamente simple. Las líneas 5 a 7 contienen la declaración de atributos que representan la información que vamos a almacenar en las instancias de la clase. Se declaran con la visibilidad private para garantizar que sólo el código de la clase pueda acceder a ellas. A continuación se declaran los constructores (líneas 9 a 29). Las distintas versiones permiten crear instancias en función de la información disponible. Para evitar la duplicación de código, los constructores pueden invocarse mutuamente (líneas 16, 21, 27).

Si bien es posible utilizar directamente los atributos en los constructores, es preferible utilizar los métodos setXXXX para acceder, de cara a aprovechar las eventuales verificaciones realizadas sobre los valores que se aplican a dichos atributos.

Para hacer que los atributos sean accesibles desde el exterior de la clase, cada uno debe disponer de los métodos getXXXX y setXXXX que permiten obtener el valor del atributo o asignarle uno nuevo.

El método toString permite obtener una representación en forma de cadena de caracteres de la instancia de la clase.

El método main crea, a continuación, dos instancias de la clase Articulo, bien utilizando el constructor por defecto e inicializando a continuación los atributos uno a uno (líneas 9 a 12), o bien utilizando el constructor correspondiente a la lista de atributos disponibles (línea 14). Las dos instancias se muestran, a continuación, por la llamada de la función prueba, que permite definir el formato de representación o bien utilizar el método toString. En este caso, el formato lo impone la clase Articulo.


/********************* Articulo **********************/  
1. package ejercicios.capitulo3.ejercicio1;  
2.   
3. public class Articulo   
4. {  
5.     private int referencia;  
6.     private String designación;  
7.     private double precio;  
8.       
9.     public Articulo()  
10.       {  
11.            super();  
12.       }  ...