Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manejo Ide Netbeans Con Objetos
Manejo Ide Netbeans Con Objetos
Manejo Ide Netbeans Con Objetos
INGENIERIA DE SISTEMAS
Contenido
TALLER INICIAL NETBEANS ............................................................................................................. 2
Características de los objetos ............................................................................................................... 17
Instanciación de objetos ..................................................................................................................... 19
Llamada al método contructor .......................................................................................................... 19
Compilación de aplicación con varios archivos java .............................................................................. 19
Llamada al método constructor con parámetros .................................................................................. 20
Instanciación de objetos de clases Java.............................................................................................. 20
Paquetes e import ........................................................................................................................... 21
Declaración de Clases ......................................................................................................................... 23
Estructura básica de una clase en Java .............................................................................................. 23
Declaración de atributos .................................................................................................................. 23
Declaración de métodos ................................................................................................................... 24
Creación de nueva clase en NetBeans ................................................................................................ 25
Clases de objetos............................................................................................................................. 36
Protección de miembros .................................................................................................................. 46
Relaciones entre clases ................................................................................................................... 56
Clases anidadas e interiores ............................................................................................................ 72
Interface List. Clase LinkedList api java. Ejercicio diferencias entre ArrayList y LinkedList. .......................... 78
Herencia ....................................................................................................................................... 133
Sobreescribir Métodos ................................................................................................................ 134
Polimorfismo ............................................................................................................................... 143
El objetivo de este tutorial es de mostrar cómo trabajar con Netbeans IDE 7.2 orientado a las tareas de
programación con lenguaje Java.
Y aplicar el estándar de codificación Java. Este estándar define como nombrar los paquetes, clases,
propiedades o atributos, constantes, métodos o funciones.
Ya que este tutorial trata de ilustrar el manejo y mostrar las prestaciones de Netbeans IDE 7.2, este tema del
estándar de codificación no será tratado aquí, sin embargo todos los ejemplos seguirán disciplinadamente este
estándar.
Para crear un proyecto iniciamos en el menú seleccionando en: File > New Project…
Luego veremos un cuadro con una amplia colección de tipos de proyectos organizados por categorias.
Seleccionamos: Java > Java Application.
Luego le damos en: Next >, y veremos el siguiente cuadro donde ingresaremos un nombre para el proyecto.
Nota: La creación de un proyecto Java en Netbeans trae seleccionado por defecto la opción: Create Main
Class, esto creará un paquete y una clase que contiene la función especial de Java llamado main(), el cual
hace que la clase sea ejecutable.
Luego de darle en: Finish el proyecto “tutorial” quedará listo parar trabajar.
Inicialmente podrás notar dos elementos importantes del IDE, que son:
• El explorador de Proyectos
• El Editor de Código
Los paquetes, el estándar de nombrado de paquetes dice que se utilicen únicamente minúsculas y además
utilizar como raíz el nombre del proyecto, en nuestro caso “tutorial”.
Es posible que el proyecto sea parte de una compañía u organización, en este caso se puede anteponer el
nombre del dominio, como por ejemplo:
• org.heyma.tutorial
• com.google.tutorial
Nota: La estructura de paquetes es simplemente una estructura de directorios de archivos, por lo tanto, la
estructura “com/google/proyecto” en java se escribirá “com.google.proyecto”.
En nuestro proyecto tenemos el paquete “tutorial” y vamos a anteponer el nombre de dominio de nuestra
organización.
Para agregar paquetes tan solo seleccionamos el paquete raíz. Seleccionar: New > Java Package… Colocar
el nombre siguiendo la regla de ingresar en minúsculas únicamente y listo.
Las Clases, se nombran utilizando el patrón “PascalCase“, como por ejemplo: Persona, ServiciosCliente,
ControladorDePagos, etc. Inician siempre con la primera letra en mayúscula.
Para agregar clases se procede igual a los paquetes. Seleccionar paquete: New > Java Class… Nombrar
como especifica la regla y listo.
Con esto finalizamos este capítulo. En los siguientes veremos muchas más prestaciones que tiene el Netbeans
IDE 7.2.
En este capítulo veremos las prestaciones más importantes del Editor de Netbeans IDE. Sobre todo para agilizar
las tareas más rutinarias en la práctica real en el desarrollo de aplicaciones Java.
• Codificación de clases
Codificación de clases
El diseño del sistema genera el primer trabajo de los programadores: Construir la arquitectura del sistema.
Todos los paquetes, clases e interfaces deben ser creados.
Antes de codificar el cuerpo de las clases es bueno iniciar por la estructura de paquetes y luego crear las 2027
clases del sistema :D.
En el capítulo anterior vimos cómo crear paquetes y clases dentro de un proyecto en Netbeans. Ahora
codificaremos el cuerpo la una clase <Entity> Persona, mientras vemos algunas de las prestaciones del Editor
de Netbeans.
01 /*
02 * To change this template, choose Tools | Templates
03 * and open the template in the editor.
04 */
05 package org.heyma.tutorial.model;
06
07 /**
08 *
09 * @author John
10 */
11 public class Persona {
12
13 }
La mayor carga de trabajo en el desarrollo de las clases tipo entidad está en la transcripción de las propiedades,
sin embargo es bastante sencillo y no es necesario un test funcional.
En este caso ha generado errores y el icono en la barra de numeración lo indica. Si no eres un principiante
de programación en Java sabes que son las importaciones de Date y List lo que hace falta.
Para resolver el error de dependencias o imports la opción se encuentra en el menú: Source > Fix imports ó
Ctrl + Shift + I. Pero la manera más ágil antes que una combinación de teclas es de la siguiente forma:
seleccionar dentro el editor señalando un lugar vacío y luego la opción: Fix imports.
Si se encuentran ambigüedades Netbeans mostrará el siguiente cuadro para seleccionar las Clases Correctas.
Otra Opción está en seleccionar el icono que además de mostrar el error tiene una sugerencia.
Luego las importaciones se agregarán al código y los errores en la barra de numeración desaparece.
Finalmente este tipo de clases <Entidad> debe encapsular sus propiedades, usar métodos para asignar u
obtener valores. Estos métodos se llaman: Getters y Setters.
Para ello seleccionamos dentro el editor señalando un lugar vació o a continuación de la última propiedad y
luego la opción: Insert Code… ó Alt + Insert.
Según los requerimientos selecciona las propiedades que tendrán Getter y Setter y luego presiona en el botón
Generate.
Con esto gran parte de código se habrá generado sin mucho esfuerzo.
La mayor parte de las opciones que tiene Netbeans están basadas en estándares y paradigmas de
Programación.
En el siguiente capítulo veremos cómo crear interfaces y clases de implementación y agilizar este trabajo con
Netbeans IDE 7.2
En este capítulo veremos más de las prestaciones que tiene Netbeans IDE 7.2.
Transcribiendo interfaces
Otra parte importante que proporciona el diseño de una aplicación en la que participaron arquitectos o analistas
son las interfaces, o servicios funcionales del sistema. Estos servicios implementan la lógica de negocio del
sistema, además estas clases requerirán pruebas unitarias de funcionalidad.
Los programadores ahora deben transcribir las 3200 interfaces del sistema que se está construyendo. :D
La mayor carga de trabajo está en la transcripción de los métodos de la interfaz y muchos métodos o funciones
reciben o retornan objetos de las clases entidad <Entity> del sistema. Es por eso que todas las clases entidad
ya deben estar codificadas.
En un capítulo anterior vimos cómo crear paquetes y clases en un proyecto de aplicación Java con Netbeans.
Ahora utilizando el mismo procedimiento crearemos las interfaces dentro los paquetes que corresponda. Según
el diseño de la arquitectura del sistema.
Luego de crear las interfaces ahora hay que transcribir los métodos. Será necesario agregar los imports (Ctrl +
Shift + I) correspondientes para que queden como se muestra a continuación.
Interfaz ModuloClientes.java
01 package org.heyma.tutorial.services;
02
03 import java.util.List;
04 import org.heyma.tutorial.model.Cliente;
05
06 /**
07 *
08 * @author John
09 */
10 public interface ModuloClientes {
11
12 public void registrarCliente(Cliente cliente);
13
14 public void actualizarDatos(Cliente cliente);
15
16 public void eliminarCliente(Cliente cliente);
17
18 public Cliente buscarCliente(int id);
19
20 public List listarClientes();
21 }
Interfaz ModuloBanco.java
01 package org.heyma.tutorial.services;
02
03 import org.heyma.tutorial.model.Cliente;
04
05 /**
06 *
07 * @author John
08 */
09 public interface ModuloBanco {
10
11 public void abrirCuenta(Cliente cliente);
12
13 public void cerrarCuenta(Cliente cliente);
14 }
Implementación de las Interfaces
Para implementar una interfaz se debe crear una clase y agregar a continuación del nombre la instrucción
implements seguido del nombre de la interfaz a implementar. Esto requerirá el import de la Interfaz.
Esto provocará un error en la Clase referida a que se deben implementar los métodos de la Interfaz. Ahora
utilizando las opciones del editor de Netbeans vamos a generar código.
Como en el anterior capítulo vamos a utilizar la opción de: Insert code… (Alt + Insert) o seleccionando en un
lugar vacío del cuerpo de la clase, es decir, entre las llaves { … }. Luego seleccionamos la opción:
Implement Method…
Luego debemos seleccionar todos los métodos a menos que la Clase esté definida como Abstracta.
01 package org.heyma.tutorial.services.impl;
02
03 import java.util.List;
04 import org.heyma.tutorial.model.Cliente;
05 import org.heyma.tutorial.services.ModuloClientes;
06
07 /**
08 *
09 * @author John
10 */
11 public class ModuloBancoImpl implements ModuloClientes {
12
13 @Override
14 public void registrarCliente(Cliente cliente) {
15 throw new UnsupportedOperationException("Not supported yet.");
16 }
17
18 @Override
19 public void actualizarDatos(Cliente cliente) {
20 throw new UnsupportedOperationException("Not supported yet.");
21 }
22
23 @Override
24 public void eliminarCliente(Cliente cliente) {
25 throw new UnsupportedOperationException("Not supported yet.");
26 }
27
28 @Override
29 public Cliente buscarCliente(int id) {
30 throw new UnsupportedOperationException("Not supported yet.");
31 }
32
33 @Override
34 public List listarClientes() {
35 throw new UnsupportedOperationException("Not supported yet.");
36 }
37 }
Finalmente quedará sustituir las líneas con:
Nota: El uso de la programación contra interfaces ayuda de gran manera al trabajo en equipo. Por ejemplo:
Hay dos clases de servicios y asignadas a distintos programadores. Cuando una clase hace la llamada a métodos
de la otra clase pero ninguna clase esta implementada, él programador no necesita esperar la implementación
de la clase que necesita, puede utilizar su Interfaz que ya está disponible.
Ya que este tutorial trata de cómo utilizar Netbeans IDE, no entraremos en el tema del uso de los paradigmas y
las técnicas de programación.
No todos los programadores transcriben el código con el mismo estilo, pero una de las opciones que tiene el
editor de Netbeans, es el formateo del código.
Esta opción está seleccionando en un lugar vacío del editor. Luego: Format o Alt + Shift + F
Clase Mesa:
De una determinada clase se pueden crear una serie de objetos, que serán instancias de esa clase. Objeto,
instancia de clase o instancia son sinónimos. Siguiendo el ejemplo de la clase "Mesa", se pueden crear
diversas mesas cada una de ellas con sus propios atributos, aunque pueden tener valores iguales en algunos
casos. Cada objeto (mesa) creado tendrá un nombre exclusivo de lo identifica.
Cada clase tendrá definida una serie de operaciones que se pueden realizar sobre los objetos creados de esa
clase. Esas operaciones se denomina métodos. Siempre habrá un método para crear los objetos de la clase que
se denomina método constructor. En el ejemplo de la clase "Mesa" se tendrá un método para crear las mesas,
y se pueden definir otros que permitan realizar una serie de operaciones, por ejemplo:
• moverMesa: Permitiría cambiar la ubicación de una determinada mesa, por ejemplo, del Aula1 al Aula2.
• pintarMesa: Permitiría cambiar el color de una determinada mesa, indicando el nuevo color que tendría.
• dameAncho: Permitíría conocer el ancho de la mesa.
Algunos métodos necesitarán alguna información para efectuar su acción. Por ejemplo, si tenemos al método
moverMesa habría que indicarle dónde se debe colocar, o el método pintarMesa que debe conocer el color de la
pintura a aplicar.
También hay métodos que nos pueden dar (retornar) alguna información, además de llevar a cabo alguna
acción.
Por ejemplo el método dameAncho nos proporciona un dato numérico sobre la medida del ancho de la mesa.
Cualquier aplicación en Java se compone de un conjunto de clases, de las que se pueden crean objetos que
interactúen entre sí. El programador puede instanciar (crear) objetos de las clases definidas por él, o bien, de
las clases incluidas en el lenguaje Java.
Los nombres de las clases en Java empiezan, por convenio, en mayúscula, y los nombres de los objetos y
de los métodos empiezan por minúscula, usando la misma estructura que los nombres de variables. Así por
ejemplo, hablarías de la clase Mesa (empieza en mayúsculas) y del objeto mesa1 (empieza en minúscula).
Las clases que incorpora el lenguaje Java por defecto se encuentran declaradas en la API de Java. Esta
documentación es la fuente de información principal para conocer las distintas clases de las que podemos
disponer como programadores, así como de su uso.
La API de Java está estructurada en tres secciones. En la parte superior izquierda se encuentran
los paquetes, que son los que contienen las clases. Una vez que se selecciona un determinado paquete,
las clases que contiene se muestran en la parte inferior izquierda. Si seleccionamos una de esas clases, en la
parte central aparecerá toda la información que nos ofrece la API referente a esa clase para ayudarnos en su
uso. En la imagen anterior se está mostrando la información de la clase String.
Es por tanto, una documentación que siempre debe estar a mano del programador Java.
Instanciación de objetos
new NombreDeLaClase()
Esto sería una llamada al método constructor de la clase. Este tipo de llamada nos devuelven una instancia u
objeto de dicha clase. Una vez creado el objeto, podemos guardarlo en una variable o utilizarlo dentro de
cualquier expresión compatible con la clase del objeto creado.
Para declarar una variable que pueda contener un objeto de una determinada clase se actúa de forma similar a
la declaración de las variables habituales, es decir, siguiendo la estructura:
NombreDeLaClase nombreDeLaVariable;
Es muy habitual que a la vez que se declara una variable, se cree un objeto de su misma clase y se le asigne a
dicha variable, formando una sentencia completa de la siguiente forma:
Para ver todo esto sobre un ejemplo, vamos a utilizar la clase Ficha, cuyo código fuente
puedes descargar aquí. En el archivo que se descarga puedes comprobar que contiene una carpeta
llamada javadoc que contiene la documentación sobre la clase Ficha en formato web (abre el archivo
index.html o Ficha.html).
Con esta clase de ejemplo, podrías crear una serie de objetos de esa clase utilizando el formato comentado
anteriormente:
01.public class EjemploCreaObjetos {
02.public static void main(String args[]) {
03.//Ejemplo de declaración de variable y creación de objeto en dos pasos
04.Ficha ficha1;
05.ficha1 = new Ficha();
06.//Ejemplos de declaración de variable y creación de objetos en un paso
07.Ficha f = new Ficha();
08.Ficha fichaRoja = new Ficha();
09.}
10.}
La ejecución se realiza llamando al comando java indicando el nombre de la clase que contiene el método main.
En el ejemplo se haría:
java EjemploCreaObjetos
El número y tipo de dato de los parámetros debe estar indicado en la documentación del método
constructor de la clase. En el momento de hacer la llamada al método constructor hay que cumplir el número de
parámetros que admite así como sus tipos de dato.
Hay que tener en cuenta que una misma clase puede tener varios métodos constructores, todos ellos con el
mismo nombre que la clase, pero variará el número y/o tipo de datos de los parámetros.
En la documentación de la clase de ejemplo Ficha, puedes encontrar dos métodos constructores que vienen
declarados de la siguiente manera:
Podemos ver que existe un método constructor sin parámetros y otro con 3 parámetros que deben ser de los
siguientes tipos: (char, int, int). Debe mantenerse el orden indicado, y hay que tener en cuenta que los nombres
mostrados para los parámetros sólo son indicativos. En el momento de llamar al método constructor se pueden
indicar como parámetros tanto valores literales, como variables o cualquier tipo de expresión siempre que se
cumpla con el requisito de que debe respetarse el tipo de dato.
Como ejemplo podríamos tener:
1.int posX=5;
2.Ficha fichaColocada = new Ficha('@', posX, posX-3);
Observa que el primer parámetro que debía ser un char, se ha indicado con un valor literal. Para el segundo
parámetro se ha utilizado como ejempo una variable de tipo int, ya que es el tipo de dato requerido en ese
caso. En el tercer parámetro se ha utilizado el resultado de una expresión aritmética que resulta un valor int,
como es requerido.
Pero hay clases que no disponen del método constructor de forma pública, sino que ofrecen un método para
obtener instancias, como el método getInstance que usan muchas clases Java, sobre todo aquellas afectadas
de alguna manera con la localización geográfica. Por ejemplo, la clase java.util.Calendar que permite trabajar
con fechas y horas, o la clase java.text.NumberFormat, que permite trabajar con distintos formatos de números,
incluyendo en de moneda.
En la API de Java de ese tipo de clases podemos comprobar que los métodos constructores están declarados
como protected, por lo que no pueden ser usados por otra clase externa. En la introducción de la
documentación también podemos encontrar infromación sobre cómo se debe instanciar los objetos, como indica
para la clase Calendar:
La forma de usarlo sería similar, aunque se usa la llamada al método getInstance detrás del nombre de la
clase y no se usa la palabra new.
1.java.util.Calendar fechaActual = java.util.Calendar.getInstance();
Paquetes e import
Las clases de Java están organizadas en paquetes. En la API de Java se puede comprobar esa
organización con la sección que se muestra en la parte superior izquierda. Seleccionando un paquete, se
muestran en la parte inferior todas las clases contenidas en el paquete elegido.
También se puede saber a qué paquete pertenece una clase observando la parte superior de su documentación.
Cada vez que se hace uso de una clase, hay que hacer referencia al paquete en el que se encuentra. Hay que
tener en cuenta que el mismo nombre de clase se puede encontrar en distintos paquetes y su funcionamiento
será totalmente distinto, por lo que hay que dejar bien claro a qué paquete pertenece la clase con la que
queremos trabajar.
Por ejemplo, la clase Random se encuentra en el paquete java.util, por lo que cuando la usemos debemos
indicar que es la clase java.util.Random.
La palabra import nos puede ahorrar tener que escribir siempre delante del nombre de una determinada clase
el paquete en el que se encuentra. Si indicamos en la parte inicial del código fuente (antes de la declaración de
la clase) las clases de Java que se van a utilizar, en el resto del código sólo hay que indicar el nombre de la
clase.
Por ejemplo, si la aplicación que estamos desarrollando va a hacer uso de las clases Random y Calendar,
podríamos escribir en la parte inicial:
1.import java.util.Random;
2.import java.util.Calendar;
Con esto conseguirmos que cada vez que hagamos referencia a una de esas clase, no hay que indicar el
paquete en el que se encuentran. Por ejemplo, al instanciar los objetos sólo hay que indicar:
1.Random numeroAleatorio = new Random();
2.Calendar fechaActual = Calendar.getInstance();
Incluso se puede utilizar el carácter comodín * que permite importar todas las clases de un determinado
paquete. Por ejemplo:
1.import java.util.*;
Eso evitaría escribir cada uno de los import del paquete java.util.
Declaración de Clases
Estructura básica de una clase en Java
/**
* Estructura básica de una clase en Java
*/
class NombreDeClase {
//Declaración de los atributos de la clase
tipoDato atributo1;
tipoDato atributo2;
tipoDato atributo3;
método1(argumentos) {
//Declaración de las variables propias del método1
//Sentencias de ejecución del método
}
método2(argumentos) {
//Declaración de las variables propias del método2
//Sentencias de ejecución del método
}
}
Declaración de atributos
Los atributos son las características propias de cada clase. Cada objeto creado de una determinada clase
tendrá una serie de valores asignados en dichos atributos, por tanto, permiten guardar información de cada
objeto. Se declaran de la misma manera que las variables.
Ejemplo para la clase Alumno:
class Alumno {
String nombre;
String apellidos;
int añoDeNacimiento;
int númeroPersonal;
String grupo;
String turnoHorario = "Mañana";
Declaración de métodos
Los métodos de una clase definen el comportamiento y los valores de los atributos de un determinado objeto de
esa clase.
El formato básico de declaración de los métodos es:
Los métodos pueden retornar un valor tras ejecutar las sentencias que contiene, o bien no retornar nada.
Dicho valor de retorno es entregado a la línea de código que realiza la ejecución del método, como se verá más
adelante.
Si va a retornar un valor, se debe especificar el tipo de dato en la declaración delante del nombre. El valor
que vaya a ser devuelto se indica con la sentencia return, y debe ser del mismo tipo que el indicado en la
declaración del método. Por ejemplo, para retornar un String:
String nombreMétodo() {
//Sentencias del método
return valorQueDebeRetornar;
}
Hay que tener en cuenta que la sentencia return termina la ejecución del método, por lo que debe
escribirse en el lugar donde no deba ejecutarse posteriormente ninguna otra sentencia.
Siguiendo el ejemplo de la clase Alumno, se puede declarar un método dameGrupo que obtenga el grupo en el
que se encuentra un determinado alumno:
String dameGrupo() {
return grupo;
}
El valor retornado puede ser un atributo de la misma clase o cualquier otro dato, por ejemplo, un valor booleano
que indique si el alumno es mayor de edad:
boolean esMayorEdad() {
int añoActual = 2011;
void nombreMétodo() {
//Sentencias del método
}
Por ejemplo, se puede declarar un método que únicamente muestre por pantalla el grupo al que pertenece un
alumno, sin que retorne ningún otro valor.
void muestraGrupo() {
System.out.println("El alumno: " + nombre + " " + apellidos);
System.out.println("Pertenece al grupo: " + grupo);
}
En la declaración del método se debe informar de los parámetros que puede aceptar el método, indicando el
tipo de dato y un nombre para dicho parámetro que se utilizará como una variable dentro del mismo. Se
escriben después del nombre del método, entre paréntesis y separados por comas. En los parámetros se
indicarán los datos que el método puede necesitar para realizar las operaciones que tiene encargadas.
Por ejemplo, un método que asigne a un objeto de la clase Alumno sus datos, debe conocer cuál es el nombre
del alumno, sus apellidos, año de nacimiento, número personal, grupo y turno. Por tanto, el método debe tener
los parámetros necesarios para indicarle esos datos:
Taller 1.
Nombre: nombres.
Apellidos: apellidos .
añoDeNacimiento: año de nacimiento
númeroPersonal: Identificación del alumnos
grupo: Grupo de clase
turnoHorario: Jornada de estudio es “Mañana” o “Tarde”
void asignaValores(String nom, String ape, int añoNac, int num, String gru, String turno) {
//Asignación de valores a los atributos de la clase
nombre = nom;
apellidos = ape;
añoDeNacimiento = añoNac;
númeroPersonal = num;
grupo = gru;
turnoHorario = turno;
//Mostrar mensaje informativo
JOptionPane.showMessageDialog(null,"Valores asignados correctamente");
JOptionPane.showMessageDialog(null,"El alumnos es: " + this.nombre+" "+this.apellidos+" y es del Año: "+this.añoDeNacimiento);
}
void muestraGrupo() {
JOptionPane.showMessageDialog(null,"El alumno: " + nombre + " " + apellidos+" Pertenece al grupo: " + grupo);
}
String dameGrupo() {
return grupo;
}
boolean esMayorEdad() {
int añoActual = 2015;
Guardar
Buscar
Cambiar.
Lo primero que realizamos es definir el forma global el objeto con el cual vamos a trabajar.
El botón guardar realiza los eventos de asignaValores que es la encargada de darle información a cada uno de
los atributos de los objetos, luego realiza el salvar el objeto y por ultimo limpia los textfield la programación del
botón guardar es:
try {
// Se salva el objeto con el nombre del DNI
ObjectOutputStream salida = new ObjectOutputStream(new FileOutputStream(alumno1.getNúmeroPersonal()+".alu"));
salida.writeObject(alumno1);
salida.close();
txtNombres.setText("");
TxtApellidos.setText("");
TxtGrupo.setText("");
TxtJornada.setText("");
TxtNacimiento.setText("");
TxtNumero.setText("");
// TODO add your handling code here:
} catch (Exception ex) {
JOptionPane.showMessageDialog(this,"No se guardo correctamente el alumno."+ ex);
}
Apartir de la información registrada en el campo de texto de busqueda realiza la consulta sobre los objetos
salvados, al encontrar el objeto asocia la información a las casillas de datos, la programación del Botón buscar
alumno es:
txtNombres.setText(alumno1.getNombre());
TxtApellidos.setText(alumno1.getApellidos());
TxtGrupo.setText(alumno1.getGrupo());
TxtJornada.setText(alumno1.getTurnoHorario());
TxtNacimiento.setText(""+alumno1.getAñoDeNacimiento());
TxtNumero.setText(""+alumno1.getNúmeroPersonal());
Se debe realizar la busuqedad del alumno para realizar el cambio del grupo, la programación del botón Cambiar
el grupo del alumno es:
this.dispose();
Ejercicio:
1. Crear una clase llamada profesor que contega los siguientes atributos:
a. Documento
b. Nombre
c. Apellido
d. Año
e. Profesión
2. Adicionar a la clase profesor los siguiente métodos.
a. asignarProfesor.
b. cambiarProfesion.
Clases de objetos
Las clases de objetos son los elementos básicos de la programación orientada a objetos y
representan conceptos o entidades significativos de un problema determinado. Una clase viene
descrita por dos tipos de elementos:
Atributos (o variables de clase). Describen el estado interno de cada objeto
Operaciones (o métodos). Describen lo que se puede hacer con el objeto, los servicios
que proporciona
Una clase de objetos describe las características comunes a un conjunto de objetos. Durante la ejecución de
la aplicación se producirá la instanciación de esta clase, es decir, la creación de los objetos que representan
cada uno de los individuos con sus características propias, es decir, valores específicos para sus atributos
La implementación de esta clase en Java se realizaría en un fichero con nombre Cuenta.java, y su contenido sería
el siguiente:
Los atributos pueden ser de cualquiera de los tipos básicos de Java: boolean, char, byte, short, int, long, float y
double, Referencias a otros objetos o arrays de elementos de alguno de los tipos citados.
En Java la implementación de las operaciones se realiza en el interior de la definición de la clase, justo tras su
declaración:
El acceso a los atributos de la clase desde la implementación de las operaciones se realiza de forma directa. Los
atributos u operaciones estáticas (static) son aquellos que pertenecen a la clase en sí, y no a los objetos. De un
atributo estático no se genera una copia por cada objeto que se crea. Existe una única copia compartida por
todos los objetos de la clase. Una operación estática únicamente puede acceder a miembros estáticos. El
atributo nOp mantiene una cuenta global del número de operaciones realizadas en las cuentas del banco, para
la realización de estadísticas. La operación leerNOperaciones () permite leer este contador. La operación
eurosAPesetas () es una operación auxiliar de la clase Cuenta para ser usada cuando sea necesaria una
conversión de moneda
Vamos a crear un proyecto en donde se crea la clase cuenta y podamos visualizar la información corrspondiente
de las operaciones
Ya creado el proyecto
long numero;
String titular;
float saldo;
float interesAnual;
// Contador de operaciones
static int nOp = 0;
static int leerNOperaciones(){
return nOp;
}
Ahora vamos a realizar la forma del manejo de la cuenta, para ello creamos una frame de nombre FCuenta y le
adicionamos los componentes necesarios para su trabajo:
La programación de Botón Crear la cual realiza la asociación de la información directamente a los campos por
que estos son públicos luego slava el objeto y limpia los textfield para seguir ingresando cuentas es:
El botón buscar realizar las tares de busqueda de la cuenta apartir de la información registrada en la casilla de
número si no la encuentra envia un mensaje de error y si la encuentra presenta la información en cada casilla.
La programación es:
txtinteres.setText(""+nvacuenta.interesAnual);
txtnumero.setText(""+nvacuenta.numero);
txttitulas.setText(""+nvacuenta.titular);
txtSaldo.setText(""+nvacuenta.saldo);
El botón Retirar realiza la operación sobre la cuenta que se encuentra activa y realiza el retiro, lo que implica
que se debe buscar antes de retirar, la programación del botón es:
nvacuenta.retiro(Float.parseFloat(txtretiro.getText()));
try {
// Se salva el objeto con el nombre del DNI
ObjectOutputStream salida = new ObjectOutputStream(new FileOutputStream(nvacuenta.numero+".cta"));
salida.writeObject(nvacuenta);
salida.close();
txtSaldo.setText("");
txtnumero.setText("");
txttitulas.setText("");
txtinteres.setText("");
// TODO add your handling code here:
} catch (Exception ex) {
JOptionPane.showMessageDialog(this,"No se guardo correctamente la cuenta."+ ex);
} // TODO add your handling code here:
}
El botón Consignar realiza la operación sobre la cuenta que se encuentra activa y realiza la consignación, lo que
implica que se debe buscar antes de consiganr, la programación del botón es:
Protección de miembros
El principio de ocultación de información se plasma en los lenguajes OO en diversos mecanismos de protección
de los miembros de la clase.
UML permite asociar tres niveles de protección diferentes a cada miembro de la clase:
Miembros públicos (+). Sin ningún tipo de protección especial
Miembros privados (-). Inaccesibles desde el exterior de la clase
Miembros protegidos (#). Similares a los privados aunque se permite su acceso desde las clases descendientes.
En Java un miembro se etiqueta como público colocando el identificador public delante de su declaración Para
los miembros privados utilizaremos el identificador private
Los miembros no etiquetados son accesibles por parte de clases amigas. En C++ y otros lenguajes OO las clases
amigas a una dada pueden indicarse explícitamente.
En Java se consideran amigas todas aquellas que forman parte del mismo paquete.
• Un fichero fuente java forma en sí un paquete y por tanto todas las clases incluidas en él son amigas.
• Las clases incluidas en varios ficheros fuente pueden agruparse en un único paquete indicando el
nombre de paquete al principio de cada fichero mediante el indicador package
En este ejemplo, las clases Cuenta y Banco son amigas al pertenecer al mismo fichero fuente. El acceso a los
atributos de los objetos de la clase Cuenta almacenados en el vector interno de Banco queda así garantizado. El
atributo saldo puede mantenerse como privado puesto que existe una operación que permite obtener su valor.
Atención: todas las clases que no se declaren como pertenecientes a ningún paquete de forma explícita,
pertenecen a un paquete “por defecto” y por tanto son amigas.
Un paquete crea un espacio de nombres propios. Esto significa que la clase pasa a tener como prefijo el propio
nombre del paquete. A la hora de utilizarla tenemos tres opciones:
• Utilizar su nombre completo: prueba.A
• Importar esa clase, para poder utilizarla sin el prefijo. Esto se indica al principio del código fuente
mediante import prueba.A
• Importar directamente todas las clases del paquete, que se usarían sin prefijo: import prueba.*
Como los atributos son privados vamos utilizar la forma automatica de crear los get y set asi como el constructor
para ello vamos a la cuenta damos clic derecho y nos muestra el menu contextual
Seleecionamos la opción Insert Code.. que es la que me permite crear los eventos.
Seleccionamos la opción y nos permite escoger que atributos tiene las opciones, para nuestr casos son todos:
Damos clic en generate y me crea las funciones y procedimientos get y set por atributo
Luego procedemos a crear el constructor vamos por el menu contextual y seleccionamos constructor
// Código Generado
String Ver_Informacion(){
return "La cuenta # "+numero+" tiene saldo de "+saldo+" en "+transacciones+" transacciones y tiene clave "+Clave;
}
Aqui no creamos la opción de Cuenta nvacuenta= new Cuenta(); dado que tenemos un constructor creado por
lo cual debemos de dejar sola la definición del objeto Cuenta nvacuenta; y al momento de ingresar la
información es cuando creamos el objeto con información. Dicha programación la tiene el botón crear:
try {
// Se salva el objeto con el nombre del DNI
ObjectOutputStream salida = new ObjectOutputStream(new FileOutputStream(nvacuenta.getNumero()+".cta"));
salida.writeObject(nvacuenta);
salida.close();
txtSaldo.setText("");
txtnumero.setText("");
txttransac.setText("");
txtclave.setText("");
// TODO add your handling code here:
} catch (Exception ex) {
JOptionPane.showMessageDialog(this,"No se guardo correctamente la cuenta."+ ex);
}
La programación de buscar se realiza a partir de la información digita el realiza la busqueda por el código si
encuentra la cuenta la presenta si no envia un mensaje de no existencia de la cuenta la programación es la
siguiente:
txtclave.setText(""+nvacuenta.getClave());
txtnumero.setText(""+nvacuenta.getNumero());
txttransac.setText(""+nvacuenta.getTransacciones());
txtSaldo.setText(""+nvacuenta.getSaldo());
El procedimiento retiro lo realiza a partir de la cuenta buscada y encontrada aplica el evento retirar definido en
la clase el código es el siguiente:
El procedimiento consignación lo realiza a partir de la cuenta buscada y encontrada aplica el evento consignar
definido en la clase el código es el siguiente:
En cambio, la asociación es la relación más importante y más común. Refleja una relación entre dos
clases independientes que se mantiene durante la vida de los objetos de dichas clases o al menos
durante un tiempo prolongado. En UML suele indicarse el nombre de la relación, el sentido de dicha
relación y las cardinalidades en los dos extremos. Vamos a sustituir el atributo titular por una
asociación con una nueva clase Cliente completa
La agregación es un tipo especial de asociación donde se añade el matiz semántico de que la clase de
donde parte la relación representa el “todo” y las clases relacionadas “las partes”. Realmente Java y la
mayoría de lenguajes orientados a objetos no disponen de una implementación especial para este tipo
de relaciones. Básicamente se tratan como las asociaciones ordinarias.
La composición es un tipo de agregación que añade el matiz de que la clase “todo” controla la
existencia de las clases “parte”. Es decir, normalmente la clase “todo” creará al principio las clases
“parte” y al final se encargará de su destrucción. Supongamos que añadimos un registro de
movimientos a la clase Cuenta, de forma que quede constancia tras cada ingreso o reintegro.
Las composiciones tienen una implementación similar a las asociaciones, con la diferencia de que el
objeto principal realizará en algún momento la construcción de los objetos compuestos.
TALLER PRACTICA 04
Creamos un proyecto con nombre Taller04 y creamos las clases Cliente y Cuenta, con la siguiente estructura.
Crear:
try {
// Se salva el objeto con el nombre del DNI
ObjectOutputStream salida = new ObjectOutputStream(new FileOutputStream(NvoCliente.getDocumento()+".cli"));
salida.writeObject(NvoCliente);
salida.close();
txtDocumento.setText("");
txtNombre.setText("");
txtLocalidad.setText("");
Buscar:
Como los atributos son privados vamos utilizar la forma automatica de crear los get y set asi como el constructor
para ello vamos a la cuenta damos clic derecho y nos muestra el menu contextual
Seleecionamos la opción Insert Code.. que es la que me permite crear los eventos.
Seleccionamos la opción y nos permite escoger que atributos tiene las opciones, para nuestr casos son todos:
Damos clic en generate y me crea las funciones y procedimientos get y set por atributo
Luego procedemos a crear el constructor vamos por el menu contextual y seleccionamos constructor
public Cuenta(int numero, double saldo, int transacciones, Cliente Titular, String Clave) {
this.numero = numero;
this.saldo = saldo;
this.transacciones = transacciones;
this.Titular = Titular;
this.Clave = Clave;
}
private int numero;
private double saldo;
private int transacciones;
private Cliente Titular;
private String Clave;
String Ver_Informacion(){
return "La cuenta # "+numero+" tiene saldo de "+saldo+" en "+transacciones+" transacciones y tiene clave "+Clave;
}
Aqui no creamos la opción de Cuenta nvacuenta= new Cuenta(); dado que tenemos un constructor creado por
lo cual debemos de dejar sola la definición del objeto Cuenta nvacuenta e igulamente realizamos con
NvoCliente; y al momento de ingresar la información es cuando creamos el objeto con información. Antes de
crear la cuenta se debe cerciorar que el cliente existe para ello realizamos el procedimiento de buscar el titular
la programación es:
try {
ObjectInputStream entrada = new ObjectInputStream(new FileInputStream(txtBuscarTitular.getText()+".cli"));
NvoCliente=(Cliente)entrada.readObject();
entrada.close();
txtNombreTitular.setText(""+NvoCliente.getNombre());
} catch (Exception ex) {
JOptionPane.showMessageDialog(this, "Error:"+ex);
}
Con esta busqueda nos trae la información del titular y lo asocia al objeto NvoCliente que es global
La programación de buscar se realiza a partir de la información digita el realiza la busqueda por el código si
encuentra la cuenta la presenta si no envia un mensaje de no existencia de la cuenta la programación es la
siguiente:
El procedimiento retiro lo realiza a partir de la cuenta buscada y encontrada aplica el evento retirar definido en
la clase el código es el siguiente:
El procedimiento consignación lo realiza a partir de la cuenta buscada y encontrada aplica el evento consignar
definido en la clase el código es el siguiente:
Para realizar el llamado de los clientes y de las cuentas debemos crear una forma para realizar el llamado de las
formas en este caso creamos un forma principal con un menu para llamar a la formas:
Se debe realizar el cambio de forma pricipal del proyecto esta la forma de cuenta ahora debe quedar la forma
del Menú, igualmente se debe realizar el llamado de cada forma en su respectivo item menu.
Menú Principal:
Tiene para Administrar Cuentas y Clientes, antes de crear una cuenta se debe crear un cliente.
Opción de Cliente:
Realizamos pruebas.
Taller ahora deseamos crear la clase localidad con los atributos de codigo de tipo entero y nombre de tipo String
realizar los cambios necesarios del proyecto para crear ciudades y estas ser asociadas al titular.
Desde el punto de vista de la organización del código, tendría mucho más sentido introducir la clase Movimiento
en el interior de Cuenta. Al ser declarada como privada, se impediría su utilización desde el exterior.
Cuando la clase anidada no es estatica, se denomina clase interior y tiene caracteristicas especiales:
1. •Pueden ser creadas unicamente dentro de la clase continente
2. •Tiene acceso completo y directo a todos los atributos y operaciones del objeto que realiza su creacion
Los objetos de la clase interior quedan ligados permanentemente al objeto concreto de la clase continente que
realizo su creación.
No debe confundirse este elemento con la relacion de composicion, aunque en muchos casos es posible utilizar
clases interiores para la implementacion de este tipo de relaciones.
Implementando la clase Movimiento como una clase interior es posible copiar el valor del saldo actual de la
cuenta que realiza el movimiento de manera directa.
Cuando la clase anidada no es estática, se denomina clase interior y tiene características especiales:
• Pueden ser creadas únicamente dentro de la clase continente
• Tiene acceso completo y directo a todos los atributos y operaciones del objeto que realiza su creación
• Los objetos de la clase interior quedan ligados permanentemente al objeto concreto de la clase continente
que realizó su creación
• No debe confundirse este elemento con la relación de composición, aunque en muchos casos es posible
utilizar clases interiores para la implementación de este tipo de relaciones
Implementando la clase Movimiento como una clase interior es posible copiar el valor del saldo actual de la
cuenta que realiza el movimiento de manera directa
Autoreferencias
• En ocasiones es necesario obtener una referencia en la implementacion de una operacion al propio
objeto sobre el que ha sido invocada la operacion
• Esta referencia se obtiene en C++ y Java mediante el operador this
• Cuando encontremos this en una expresion, podremos sustituirlo mentalmente por “este objeto”
• Aunque no es necesario, podemos utilizar this para llamar desde la implementacion de una operacion a
otra operacion del mismo objeto
La llamada a la operación ingreso desde ingresoInteresMes() puede realizarse utilizando this como
referencia del objeto sobre el que se invoca la operación
En este ejemplo, el uso de this es realmente útil. Nos permite implementar la operación
transferirDesde() llamando a una operación transferirHasta(), previamente implementada
En este ejemplo, el uso de this es realmente útil. Nos permite implementar la operación
transferirDesde() llamando a una operación transferirHasta(), previamente implementada
• Otra utilidad de this en Java es realizar una llamada a un constructor desde otro constructor
Vamos a continuar el estudio de la interface List del api de Java, pero esta vez usaremos la clase LinkedList
como forma de instanciar la interface. También veremos las características más importantes de LinkedList, las
diferencias que tiene con ArrayList y haremos un ejemplo a modo de ejercicio.
LINKEDLIST
La clase LinkedList implementa la interface List. Eso quiere decir que tendrá una serie de métodos propios de
esta interface y comunes a todas las implementaciones. Así utilizando siempre que se pueda declaración de
objetos del tipo definido por la interface podemos cambiar relativamente fácil su implementación (por ejemplo
pasar de ArrayList a LinkedList y viceversa) y conseguir mejoras en el rendimiento de nuestros programas con
poco esfuerzo.
Ahora centrándonos en la clase LinkedList, ésta se basa en la implementación de listas doblemente enlazadas.
Esto quiere decir que la estructura es un poco más compleja que la implementación con ArrayList, pero… ¿Qué
beneficios nos aporta si la estructura es más compleja?.
¿Rapidez?, pues no mucha la verdad, de hecho ArrayList es la favorita para realizar búsquedas en una lista y
podríamos decir que ArrayList es más rápida para búsquedas que LinkedList. Entonces, ¿qué interés tiene
LinkedList?. Si tenemos una lista y lo que nos importa no es buscar la información lo más rápido posible, sino
que la inserción o eliminación se hagan lo más rápidamente posible, LinkedList resulta una implementación muy
eficiente y aquí radica uno de los motivos por los que es interesante y por los que esta clase se usa en la
programación en java.
La clase Linkedlist no permite posicionarse de manera absoluta (acceder directamente a un elemento de la lista)
y por tanto no es conveniente para búsquedas pero en cambio sí permite una rápida inserción al inicio/final de
la lista y funciona mucho más rápido que Arraylist por ejemplo para la posición 0 (imaginemos que en un
ArrayList deseamos insertar en la posición 0 y tenemos muchos elementos, no solo tendremos que realizar la
operación de insertar este nuevo elemento en la posición 0 sino que tendremos que desplazar el elemento que
teníamos de la posición 0 a la 1, el que estaba anteriormente en la posición 1 a la 2 y así sucesivamente… Si
tenemos un gran número de elementos la operación de inserción es más lenta que en la implementación
LinkedList, donde el elemento simplemente “se enlaza” al principio, sin necesidad de realizar desplazamientos en
cadena de todos los demás elementos).
Es posible que en un programa tengamos que usar una lista pero no sepamos si es más conveniente usar
ArrayList ó LinkedList. En este caso podemos hacer lo siguiente:
Si a priori pensamos que es mejor utilizar una implementación con ArrayList porque pensamos que las
búsquedas van a ser la mayoría de las operaciones, entonces pondremos algo así: List listaObjetos = new
ArrayList();
Por el contrario si pensamos a priori que la mayoría de las operaciones sobre esta lista de objetos van a ser
inserciones o eliminaciones sobre listas grandes escribiremos: List listaObjetos = new LinkedList();
Aquí queda reflejada la utilidad que tiene el uso de interfaces, porque usando los mismos métodos, podemos
tener varias implementaciones que nos permitirán un mejor rendimiento dependiendo del uso que demos a
nuestra aplicación.
Vamos a realizar a continuación un ejercicio comparativo, donde vamos a observar y medir el tiempo que tarda
en realizarse una inserción en una lista ArrayList y en otra lista LinkedList.
Para ello y basándonos en la clase Persona que hemos venido utilizando a lo largo del curso, escribiremos este
código en nuestro editor:
this.idPersona = idPersona;
this.nombre = nombre;
this.altura = altura;}
@Override
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
long antes;
for(int i=0;i<10000;i++)
listalinked.add(new Persona(i,"Persona"+i,i));
antes = System.nanoTime();
System.out.println(System.nanoTime()- antes);
antes = System.nanoTime();
System.out.println(System.nanoTime()- antes);
Como podemos observar en el código de la clase Programa, creamos 2 listas, una basada en la implementación
ArrayList y otra basada en LinkedList. A continuación declaramos una variable de tipo long para contar el tiempo
invertido en cada inserción.
Previamente a esto, cargamos en las listas respectivamente 10.000 personas lo cual no es ni mucho menos una
gran cantidad (piensa por ejemplo en una empresa de telefonía móvil, puede tener muchos miles de clientes),
pero tampoco queremos alargar mucho el proceso de carga en este ejemplo.
Bien, pues una vez cargadas nuestras listas: listaarray y listalinked, medimos el periodo de tiempo que consume
una inserción en la posición 0 en cada implementación y obtenemos los siguientes resultados.
Como vemos el tiempo invertido en insertar una persona en la posición inicial en una lista implementada con
ArrayList es mayor que el empleado en una LinkedList. Si este proceso tuviéramos que hacerlo repetitivamente,
el coste en tiempo podría ser significativamente diferente y motivo suficiente para usar una implementación u
otra.
Ahora cambiaremos el código de programa, para insertar a la nueva persona en la posición 5000 en vez de en la
posición 0, lo que hacemos con este código (listaarray.add(5000,new Persona(10001,"Prueba",10001)); y
listalinked.add(5000,new Persona(10001,"Prueba",10001)); ) y tras ejecutar de nuevo el programa obtendremos
una pantalla algo similar a la siguiente:
Vemos que en esta ocasión el tiempo en insertar con listaarray es más o menos el mismo que en el anterior
ejemplo, pero que con listalinked insertar en la posición media de la lista es tremendamente más lento. Esto es
debido a que para insertar en esa posición la implementación con linkedlist debe recorrer parte de la lista hasta
llegar a esa posición, mientras que con arraylist tenemos acceso directo a una posición determinada. Todo esto
está relacionado con la forma en que está implementado el código del api de Java, aspectos que no tenemos
por qué conocer pero que afectan al rendimiento o idoneidad de una clase u otra. Aunque no tengamos que
conocer el código del api Java, sí debemos ser conscientes de las ventajas e inconvenientes que puede tener el
uso de una u otra clase como programadores.
Ahora para finalizar vamos a utilizar el método add sin una posición determinada, pero que por defecto añade el
nuevo elemento en la última posición.
Por tanto volvemos a modificar el código de la clase Programa y sustituiremos las líneas listaarray.add(5000,new
Persona(10001,"Prueba",10001)); por listaarray.add(new Persona(10001,"Prueba",10001)); y
listalinked.add(5000,new Persona(10001,"Prueba",10001)); por listalinked.add(new
Persona(10001,"Prueba",10001));
En donde vemos que los tiempos de inserción han disminuido en ambos casos tanto en la implementación con
arrays como con listas enlazadas. En este último caso espectacularmente (en nuestro caso tan solo 962
nanosegundos, aunque estos valores dependen del ordenador que estemos utilizando), lo que nos indica que
LinkedList es muy eficiente en las inserciones en posición inicial y final de una lista.
CONCLUSIONES
Este ejemplo nos ha servido para sacar unas claras conclusiones ya no solo acerca del uso de ArrayList y
LinkedList, sino sobre el uso de interfaces a modo general para saber qué implementación nos puede convenir
utilizar en función del tipo de procesos que vayan a ser más habituales.
En cuanto a ArrayList y LinkedList vemos que las inserciones en posiciones iniciales o finales son por regla
general más rápidas con LinkedList. Igualmente pasaría con las eliminaciones o borrados. Aunque observamos
que las búsquedas o las inserciones en posiciones intermedias de una lista con gran número de elementos es
más rápida en el caso de ArrayList. Esto es debido a que ésta accede a la posición de manera directa.
Para finalizar esta comparación vemos que el método add por defecto sin posición es más rápido que insertar en
posiciones iniciales o intermedias en ambas implementaciones.
• Cuando se supera el tamaño del array, se crea uno nuevo más grande y se copian en él los elementos
del antiguo
• Tamaño ilimitado
1 import java.util.*;
Son clases genéricas
Las operaciones que usan index pueden lanzar IndexOutOfBoundsException si el valor de index no es válido.
Los métodos contains, indexOf y lastIndexOf utilizan el método equals para localizar el objeto.
En la entrega de hoy, vamos a ver un ejemplo de utilización del LinkedList, para posteriormente plantear
un ejercicio del mismo, del cual, daremos la solución la próxima semana.
Vamos por lo tanto con el primero de los ejemplos, en este caso, el de LinkedList.
Puede ser conveniente hacer nuestra propia implementación para conseguir más sencillez y eficiencia.
Operaciones
• añadir un cliente
• atender a un cliente
• obtener el tiempo medio de espera de los clientes que aún no han sido atendidos
Escribir también un programa de prueba. Para la fecha y hora usar la clase predefinida Calendar.
Vamos a implementar la clase Reloj, que nos dará una medida para calcular el tiempo que tarda en ser atendido
un paciente:
1 import java.util.Calendar;
2 /**
3 * Clase que permite obtener la fecha y hora actual,
4 * en milisegundos desde la época
5 */
6 public class Reloj
7{
8 public static long ahora()
9 {
10 return Calendar.getInstance().getTimeInMillis();
11 }
12 }
Ahora vamos a implementar la cola de espera, propiamente dicha:
1 import java.util.*;
2 public class ColaEspera {
3 /** Clase interna para almacenar todos los
4 * datos de un cliente
5 */
6 private static class DatosCliente {
7 String nombre;
8 long entrada, salida; // milisegundos
9 /** Constructor; pone la hora de entrada*/
10 DatosCliente (Cliente c) {
11 this.c=c;
12 entrada=Reloj.ahora();
13 }
14
15 void atiende() {
16 salida=Reloj.ahora();
17 }
18 }
19 // colas del servicio
20 private Queue<DatosCliente> colaEspera;
21 private Queue<DatosCliente> colaAtendidos;
22 /**Constructor de ColaEspera */
23 public ColaEspera() {
24 colaEspera=new LinkedList<DatosCliente>();
25 colaAtendidos=new
26 LinkedList<DatosCliente>();
27 }
28
29 /**
30 * Nuevo cliente; se mete en la cola de espera
31 */
32 public void nuevoCliente(Cliente c)
33 {
34 DatosCliente datos=new DatosCliente(c);
35 colaEspera.add(datos);
36 }
37
38 /**
39 * Atender cliente: se saca de la cola de
* espera y se mete en la de
40
atendidos;
41 * retorna el cliente atendido
42 */
43 public Cliente atenderCliente()
44 throws NoSuchElementExceptio
n
45 {
46 DatosCliente datos=colaEspera.remove();
47 datos.atiende();
48 colaAtendidos.add(datos);
49 return datos.c;
50 }
51
52 public double tiempoEsperaAtendidos()
53 {
54 long tiempo=0;
55 int num=0;
56 for (DatosCliente datos: colaAtendidos) {
57 tiempo=tiempo+datos.salida-datos.entrada;
58 num++;
59 }
60 if (num==0) {
61 return 0.0;
62 } else {
63 return (((double) tiempo)/num)/1000.0;
64 }
65 }
66 }
Como parte opcional, se puede hacer un programa principal que prueba el funcionamiento de esta cola, creando
un main y añadiendo clientes y extrayéndolos, y comprobando el tiempo que ha tardado en ser atendido.
Como podéis ver el funcionamiento de las LinkedList es sencillo, y los métodos que hereda de la interfaz List nos
facilitan muchos las cosas. Ahora vamos a proponeros un ejercicio ara que practiquéis.
Ejercicio
Se pide implementar una lista que gestione la lista de espera de un taller mecánico. El taller tendrá una lista de
fichas de vehículos que serán dados de alta en el momento de su llegada al taller, donde se le asignará la hora
de entrada. Una vez resuelto el problema del coche se le asignará una fecha de resolución de la avería y sólo
cuando el técnico venga a buscarlo, se le dará una fecha de salida y el borrado de la lista de espera. Es
recomendable crear tres listas, una para los no arreglados, otra para los arreglados y están pendientes de
retirar.
Lo primero de todo vamos a dar solución al ejercicio de la semana pasada que si acordáis, estaba relacionado
con un taller de reparación de coches.
Vamos con la primera de las clases de nuestro ejercicio, la clase Reloj, que únicamente será la encargada de
proporcionarnos una fecha y una hora para las fichas de nuestros vehículos del taller.
1 import java.util.Calendar;
2 /**
3 * Clase que permite obtener la fecha y hora actual,
4 * en milisegundos desde la época
5 */
6 public class Reloj
7{
8 public static long ahora()
9 {
10 return Calendar.getInstance().getTimeInMillis();
11 }
12 }
Se trata de la misma implementación que en el ejemplo que o pusimos, por lo que podéis copiar y pegar tal cual
está.
Ahora vamos con la primera de las clases que nos interesa, la clase FichaVehiculo. Se encargará de recoger
todos los datos referidos a los vehículos que entre en el taller. Estará forma principalmente por observadores de
atributos, que poseen visibilidad privada.
7 /**Constructor*/
8 public FichaVehiculo(String m, String ma, long e)
9 {
10 modelo=m;
11 matricula=ma;
12 entrada=e;
13 reparacion=0;
14 salida=0;
15
16 }
17
18 public String matricula()
19 {
20 return matricula;
21 }
22
23 public String modelo()
24 {
25 return modelo;
26 }
27
28 public void modificaFechaEntrada(long fecha_entrada)
29 {
30 entrada=fecha_entrada;
31 }
32
33 public void modificaFechaSalida(long fecha_salida)
34 {
35 entrada=fecha_salida;
36 }
37
38 public void modificaFechaReparacion(long fecha_reparacion)
39 {
40 entrada=fecha_reparacion;
41 }
42
43 public boolean estaArreglado()
44 {
45 if(reparacion!=0)
46 {
47 return true;
48 }else{
49 return false;
50 }
51 }
52
53 /****************Observadores de las fechas de reparación y salida****/
54
55 public long fechaReparacion()
56 {
57 return reparacion;
58 }
59
60 public long fechaSalida()
61 {
62 return salida;
63 }
64
65 }
Esta clase no tiene mayores complicaciones. Si se quiere, se pueden añadir más datos a tener en cuenta a la
hora de registrar un vehículo, ya que esto, sólo se trata de un modelo básico.
Vamos con la clase GestionReparaciones, que implementará la gestión de vehículos de nuestro taller.
1 import java.util.*;
2 public class GestionReparaciones
3{
4 //Atributos
38 i++;
39 }
40 }
41
42 if(encontrado==true)
43 {
44 System.out.println("Fecha de reparación modificada correctamente");
45 }else{
46 System.out.println("Error al modificar la fecha de reparación del vehículo "+ matricula);
47 }
48 }
49
50 /**Metodo que añade una fecha de salida a un vehiculo
51 *
52 * @param matricula
53 */
54 public void fechaSalidaTaller(String matricula)
55 {
56 boolean encontrado =false;
57 int i=0;
58
59 while(!encontrado && i<lista.size())
60 {
61
62 //condiciones que ha de cumplir(todas)
if(lista.get(i).matricula().equals(matricula) && lista.get(i).fechaSalida()==0 &&
63
lista.get(i).estaArreglado())
64 {
65
66 lista.get(i).modificaFechaSalida(Reloj.ahora());
67 encontrado=true;
68 }else{
69 i++;
70 }
71 }
72
73 if(encontrado==true)
74 {
75 System.out.println("Fecha de salida modificada correctamente");
76 }else{
77 System.out.println("Error al modificar la fecha de salida del vehículo "+ matricula);
78 }
79 }
80
81 /**Borramos la primera fiche de un vehiculo
82 *
83 * @return
84 */
85 public boolean eliminarPrimerRegistro()
86 {
87 if(lista.isEmpty())
88 {
89 return false;
90 }else{
91 lista.removeFirst();
92 return true;
93 }
94 }
95
96 }
Se pueden añadir más métodos si queréis practicar, ya que yo sólo he implementado el funcionamiento básico
descrito en el enunciado del ejercicio.
4 {
5 //Atributos
6 GestionReparaciones taller = new GestionReparaciones();
7 String matricula1="12345";
8 String modelo1="Leon";
9
10 String matricula2="54321";
11 String modelo2="Mondeo";
12
13 String matricula3="67890";
14 String modelo3="Laguna";
15
16 //Añado dos vehiculos al taller
17 taller.anadeVehiculo(modelo1, matricula1);
18 taller.anadeVehiculo(modelo2, matricula2);
19
20 //Voy a fijar una fecha de reparacion a un vehiculo que no existe en el taller, dara error
21 taller.reparado(matricula3);
22
23 //Este funcionara bien
24 taller.reparado(matricula1);
25
//Este dará error, no esta reparado, por lo que no puede salir, es una condicion que
26
hemos puesto en el if
27 taller.fechaSalidaTaller(matricula2);
28
29 }
30 }
Hasta aquí la solución del ejercicio. Si habéis tenido algún problema, o duda de implementación, no dudéis en
preguntarlo.
Vamos con el ejemplo de los ArrayList de Java. Vamos a hacer un ejemplo sencillo con la baraja española.
1 import java.util.*;
35 return mano;
36 }
37 }
Como podéis ver la mecánica de programación es similar a la de las LinkedList.
Como el ejercicio anterior que os propusimos tiene mucho juego, os vamos a proponer que en vez de utilizar las
LinkedList para su programación, lo implementéis utilizando los ArrayList. Y en la próxima entrega los
corregiremos y hablaremos además de las Pilas de datos y sus funciones y como se pueden
implementar.
TALLER PRACTICA 05
Creamos los objetos en este caso vamos a creas las clases Alumno y Materia.
Clase Alumno
Clase Materia
// Constructor general
public Materia(long codigo, String nombre, Alumno Estudiante, float creditos, float definitiva, float
porcentajeAcumulado, LinkedList notas) {
this.codigo = codigo;
this.nombre = nombre;
this.Estudiante = Estudiante;
this.creditos = creditos;
this.definitiva = definitiva;
this.porcentajeAcumulado = porcentajeAcumulado;
this.notas = notas;
}
this.notas = notas;
}
Alumno leerEstudiante() {
return Estudiante;
}
long leerMateria() {
return codigo;
}
Clase Nota
Luego pasamos a crear un JFrame en donde trabajamos el proceso del manejo de alumno, materia y notas.
Alumno Estudiante1;
Materia Materia1;
LinkedList notas= new LinkedList();
try {
ObjectOutputStream salida;
salida = new ObjectOutputStream(new FileOutputStream(Materia1.getCodigo()+".mat"));
salida.writeObject(Materia1);
salida.close();
JOptionPane.showMessageDialog(rootPane,"La materia se guardo en forma correcta.");
tNombre.setText("");
tDireccion.setText("");
tTelefono.setText("");
tfCedula.setText("");
tCodigoMateria.setText("");
tNombreMateria.setText("");
tCredito.setText("");
} catch (Exception ex) {
JOptionPane.showMessageDialog(rootPane,"No se pudo salvar la materia. "+ex);
}
Al momento de guardar materia el programa guardara tambien el estudiante y enviara los siguiente mensajes:
Hasta aquí tenemos la opción de gurdar la materia nos faltaria realizar la función de buscar la materia para
realizar modificaciones y salvar dicha información para ello vamos a adicionar un textfield en donde digitaremos
el código de la materia recuerde que con este valor es que almacenamos la información y a su vez adicionamos
un botón para realizar la consulta esta busqueda se utiliza el constructur de la clase que utiliza el llamado
mediante el código de la materia.
Adicionamos un label, un
textfield y un button
try {
ObjectInputStream entrada = new ObjectInputStream(new FileInputStream(tCodigoMateria1.getText()+".mat")
);
Materia1 = (Materia) entrada.readObject();
entrada.close();
tNombre.setText(Materia1.leerEstudiante().getNombre());
tDireccion.setText(Materia1.leerEstudiante().getDireccion());
tTelefono.setText(""+Materia1.leerEstudiante().getTelefono());
tfCedula.setText(""+Materia1.leerEstudiante().getCedula());
tCodigoMateria.setText(""+Materia1.getCodigo());
tNombreMateria.setText(Materia1.getNombre());
tCredito.setText(""+Materia1.getCreditos());
tDefinitiva.setText(""+formato.format(Materia1.getDefinitiva()));
String titulos[]={"NOTA","% Nota","Definitiva","Fecha"};
DefaultTableModel m = new DefaultTableModel(null,titulos);
LinkedList calificaciones = new LinkedList();
calificaciones = Materia1.getNotas();
for (int i=0;i<=calificaciones.size()-1;i++){
String fila[]=new String[4];
Nota Valor = (Nota) Materia1.getNotas().get(i);
fila[0]=""+Valor.nota;
fila[1]=""+Valor.porcentaje;
fila[2]=""+formato.format(Valor.definitivaparcial);
fila[3]=""+formatoFechaPersonal.format(Valor.fecha);
m.addRow(fila);
}
tNotas.setModel(m);
}
catch (Exception e){
JOptionPane.showMessageDialog(this,"Imposible recuperar materia. "+e);
}
}
Ejecutamos el programa recuerde que se debe crear primero el alumnos y luego la materia.
Adicionamos otro:
Ahora vamos a realizar la búsqueda de la matería para eso digitamos el código 101 y damos clic en Buscar
Materia
Vamos a realizar el procedimiento de almacenar las notas y presentarlas en la tabla para ello el código sería:
Formateo de números
La clase NumberFormat de Java permite dar formato a valores numéricos para poder mostrarlos de
forma más adecuada. Por ejemplo, puede limitar el número de decimales de una valor real, permite mostrar los
valores con separadores de miles, con símbolo de moneda o valores porcentuales.
Dispone de varios métodos que permiten instanciar objetos de su clase en función del tipo de formato que se
desea aplicar:
Todos esos métodos de instancia disponen de una segunda modalidad en la que se puede indicar un
parámetro de la clase Locale. De esa manera se puede obligar que el formateo se realice siguiendo las
características del país que se indique en el parámetro. Si no se utiliza ese parámetro, se utiliza la configuración
de país que se dispone en el sistema.
La manera más sencilla de crear objetos de la clase Locale se hace indicando como parámetro el código
del idiomasiguiendo el estándar ISO 639-1. opcionalmente se puede indicar un segundo parámetro con
el código de la regiónusando el estándar ISO 3166-1-alpha-2.
Por ejemplo, las siguientes líneas crean objetos Locale para el idioma español, el idioma inglés de Estados
Unidos, o inglés de Gran Bretaña:
También se puede utilizar la clase DecimalFormat que es una subclase de NumberFormat comentada
anteriormente. Con ella se puede crear un formato totalmente personalizado utilizando un patrón de
tipo String.
Tras crear un objeto de dicha clase indicando el patrón, se puede utilizar el método format se da formato al
valor que se pase como parámetro, retornando un objeto String con el valor formateado.
Ejemplo:
Estos son los caracteres que se pueden utilizar para dar formato con el patrón:
Símbolo Descripción
0 Un dígito obligado aunque sea 0
# Un dígito
. Lugar para el sepador de decimales
, Lugar para el separador de miles
E Separa la mantisa y el exponente para formatos exponenciales
; Separa formatos
- Prefijo por defecto para valores negativos
% Multiplica el valor por 100 y lo muestra como porcentaje
? Multiplica el valor por 1000 y lo muestra como por miles
¤ Símbolo de moneda
otro Cualquier carácter puede usarse en el prefijo o sufijo del valor
' Usado para citar caracteres especiales en el prefijo o sufijo del valor
Formato de fecha
La clase DateFormat de Java permite dar formato habitual a objetos Date que almacenan valores de tiempo,
lo cual posibilita mostrar en pantalla fechas y horas con una estética adecuada.
• FULL: Formato de fechas: sábado 6 de octubre de 2012, y formato de horas: 21H47' CEST
Sobre los objetos DateFormat se puede utilizar el método format para obtener como String la fecha y
hora a la que se desea dar formato. En su formato más sencillo, al método format hay que pasarle como
parámetro un objeto Date, que se puede obtener a partir de un objeto Calendar usando
el método getTime de esa clase Calendar.
Class DateFormat
String format(Date date)
Class Calendar
Date getTime()
System.out.println(formateadorFechaUS.format(cal.getTime()));
Como puedes observar en las últimas líneas del ejemplo, el método getDateInstance admite un segundo
parámetro en el que se debe indicar un objeto Localeque haga referencia al idioma o país sobre el que se
quiere obtener el formato de fecha y hora.
Para un control más personalizado del formato deseado, se puede utilizar la clase SimpleDateFormat de
Java, que es una extensión de la clase DateFormatcomentada anteriormente. La clase SimpleDateFormat utiliza
en el método constructor una cadena de caracteres como patrón para establecer el formato de fecha y
hora.
Para ello se dispone de una lista de caracteres asociados a cada uno de los posibles campos de fecha y hora.
Por ejemplo, el caracter 'd' hace referencia al día, o 'y' que hace referencia al año.
En función de la repetición que se haga de esos caracteres del patrón, se obtienen distintos formatos para un
mismo dato. Así si se indica como parte del patrón "yy" se mostrará el año con 2 dígitos, mientras que se
escribe como "yyyy" se mostrará en año con 4 dígitos.
Además puedes introducir cualquier texto dentro del patrón para que forme parte del formato final. Para ello
simplemente debes encerrar entre comillas simples el texto literal.
Por ejemplo, para obtener la fecha en formato "Son las 21:47 del sábado 6 de octubre de 2012" se usaría el
siguiente trozo de código fuente:
Herencia
En Java, Eiffel, Smalltalk y otros lenguajes orientados a objetos puros, todas las clases heredan
automáticamente de una superclase universal. En Java esta superclase se denomina Object
Extensión. Una clase puede servir para extender la funcionalidad de una superclase sin que
represente necesariamente un concepto más específico
Especificación. Una superclase puede servir para especificar la funcionalidad mínima común de
un conjunto de descendientes. Existen mecanismos para obligar a la i mplementación de una
serie de operaciones en estos descendientes
Construcción. Una clase puede construirse a partir de otra, simplemente porque la hija
puede aprovechar internamente parte o toda la funcionalidad del padre, aunque
representen entidades sin conexión alguna
Ejemplos de herencia:
Estructuras de datos
La clase TareaPeriodica tiene las características comunes a los tres tipos de tarea: periodo de
ejecución en segundos, hora de la última ejecución y bandera de estado activo/inactivo
Para que una clase herede de otra, utilizaremos el indicador extends en la declaración de la
clase
Todas las clases en Java heredan en última instancia de Object. Incluso si creamos una clase
independiente, Java la hace heredar implícitamente de Object
Esto hace que las clases formen una jerarquía con Object como raíz
Ahora podemos crear y usar objetos de cualquiera de las clases anteriores. Desde el exterior
tampoco existen diferencias aparentes entre la llamada a una operación heredada o propia de la
clase:
El procedimiento correcto consiste en realizar una llamada al constructor de la superclas para que
realice la inicialización de los atributos heredados
En Java esta llamada al constructor de la superclase se realiza con la operacion super() seguida
de los parámetros de inicialización de alguno de los constructores del padre de la clase
La implementación correcta del constructor de la clase TPAviso sería por tanto la siguiente:
Para terminar, es posible impedir la herencia a partir de una clase declarándola como final.
Sin embargo, esta es una característica que debe ser utilizada con prudencia, ya que puede
restringir en exceso la extensión y reutilización de las clases del sistema en el futuro.
Herencia
Las clases se pueden derivar desde otras clases. La clase derivada (la clase que proviene
de otra clase) se llama subclase. La clase de la que está derivada se denomina superclase.
Una subclase es una clase que desciende de otra clase. Una subclase hereda el estado y el
comportamiento de todos sus ancestros. El término superclase se refiere a la clase que es el ancestro más
directo, así como a todas las clases ascendentes.
De hecho, en Java, todas las clases deben derivar de alguna clase. La clase más alta, la
clase de la que todas las demás descienden, es la clase Object, definida en java.lang. Object
es la raíz de la herencia de todas las clases.
Las subclases heredan el estado y el comportamiento en forma de las variables y los métodos de su
superclase. La subclase puede utilizar los ítems heredados de su superclase tal y como son, o puede
modificarlos o sobreescribirlos. Por eso, según se va bajando por el árbol de la herencia, las clases se convierten
en más y más especializadas.
Una clase Java sólo puede tener una superclase directa. Java no soporta la herencia multiple.
class SubClass extends SuperClass {
...
}
La palabra extends indica que Subclase es extendida de Superclase. Una subclase hereda todas las
variables miembros de su superclase que puedan ser accesibles desde la subclase (a menos que la variable
miembro esté oculta en la subclase).
Las subclases heredan variables miembro declaradas:
public
•
• protected
• sin especificador de acceso siempre que la subclase esté en el mismo paquete
que la clase.
Como esta característica del lenguaje Java es poderosa y conveniente, puede ser una
fuente de errores: ocultar una variable miembro puede hacerse deliberadamente o por
accidente. Entonces, cuando nombres tus variables miembro se cuidadoso y oculta sólo las
variables miembro que realmente deseas ocultar.
Una característica interesante de las variables miembro en Java es que una clase puede
acceder a una variable miembro oculta a través de su superclase. Considere esta pareja de
superclase y subclase.
class Base{
int unNumero;
}
Constructores en herencia
Los constructores de la clase base se invocan antes del constructor de la clase derivada, los
constructores no se heredan. El constructor de la clase derivada debe incluir la llamada al constructor de la
clase base, utilizando super(); y enviando los argumentos requeridos.
Sobreescribir Métodos
La habilidad de una subclase para sobreescribir un método de su superclase permite a una clase heredar
de su superclase aquellos comportamientos "más cercanos" y luego suplementar o modificar el comportamiento
de la superclase.
Ventajas de la herencia
Ejemplos de Herencias
Ejercicio 1
empleados
-DNI
-Nombre
-Posición
-Salario
+MuestraEmpleado()
this.DNI = DNI;
}
}
Ahora vamos a efectura herencias de la tabla empleados la primera es crear la clase gerente. Creamos la clase
gerente que nace de la clase Empleados
empleados
-DNI
-Nombre
-Posición
-Salario
+MuestraEmpleado()
gerente
-bono
-auto
+MostarGerente()
El decir el gerente tiene dos nuevos atributos y un método que muestra la información. Como el gerente es una
herencia de empleados se coloca el termino extends y de que clase de origino.
Igualmente el constructor del gerente tiene la setencia super dado que se debe crear un empleado antes de
crear un gerente. La función super se utiliza para llamar los atributos y métodos de la clase padre en la clase
hija.
public gerente(int DNI, String nombre, String posicion, double salario,double bono, String auto) {
super(DNI, nombre, posicion, salario);
this.bono=bono;
this.auto=auto;
}
En el programa principal realizamos el llamado de los objetos, para ello creamos un frame en donde
construremos nuestros gerentes y los buscaremos.
Crear Objeto: Permite crear los objetos con la información digitado los objetos y almacenarlos en memoria. La
programación es la siguiente:
try {
// Se crea limpia los campos de la información suministrada
tfDni.setText("");
tfNombre.setText("");
tfPosicion.setText("");
tfSalario.setText("");
tfBono.setText("");
tfAuto.setText("");
// Se salva el objeto con el nombre del DNI
ObjectOutputStream salida = new ObjectOutputStream(new
FileOutputStream(prueba.getDNI()+".obj"));
salida.writeObject(prueba);
salida.close();
JOptionPane.showMessageDialog(this, prueba.muestraGerente());
} catch (IOException ex) {
JOptionPane.showMessageDialog(this, "Error:"+ex);
}
}
Ejercicio 1:
Producto
+PLU
+Nombre
+Precio
Libro CD
+Editorial +Genero
LIBRO
PLU NOMBRE PRECIO EDITORIAL
EL INGENIOSO HIDALGO DON QUIJOTE DE LA
1 MANCHA (ED. ESPECIAL) $ 200,000.00 ESPASA LIBROS
2 ODISEA $ 100,000.00 GREDOS
3 LAZARILLO DE TORMES (4ª ED.) $ 80,000.00 CATEDRA
CD
PLU NOMBRE PRECIO GENERO
4 TRILOGÍA EL HOBBIT (DVD) $ 150,000.00 ESPASA LIBROS
5 CORAZONES DE ACERO (DVD) $ 40,000.00 GREDOS
6 ESCALOFRIO EN LA NOCHE (BLU-RAY) $ 50,000.00 CATEDRA
Polimorfismo
El sentido del polimorfismo es realizar una generalización, olvidar los detalles concretos
de uno o varios objetos de distintas clases y buscar un punt o común a todos ellos en un
ancestro.
Vamos a implementar una nueva clase GestorTareas que va a contener una lista de
tareas a realizar. La llamada a chequearEjecutar() realizará la comprobación y ejecución de
las tareas que lo requieran.
Pero siempre debe quedar claro que tras la conexión polimorfa únicamente podemos
acceder a las opera- ciones pertenecientes a la clase asociada a la refe- rencia. El resto
de operaciones del objeto no son accesibles a través de esta referencia.
En Java, una referencia a Object puede ser conectada a cualquier objeto, puesto que
como sabemoses un ancestro de todas las clases
Además, las interfaces implementadas por una clase también pueden ser utilizadas para
realizar conexiones polimorfas
Taller 08 Polimorfismo.
Ya creado el paquete:
Creamos una clase llamada pollo y creamos dos llamados de hablar uno normal y otro repetido, es
decir con el mismo procedimiento se puede realizar dos tareas diferentes, el código queda de la
siguiente manera:
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
animal Animal = new animal();
Animal.hablar();
pollito.hablar();
pollito.hablar(5);
}
}
Ejercicios:
1. Qué es herencia?
La herencia es un mecanismo de reutilización de software que permite crear nuevas clases que
adquieren los atributos y métodos de alguna clase predefinida, es decir, una clase ya hecha.
Supongas que tenemos una clase llamana Persona y que tiene como atributos: nombre y edad
El uso de public class Estudiante extends Persona hace que la clase Estudiante tenga los mismo
atributos en que la su clase superior Persona.
Noten que el constructor de Persona recibe la edad y el nombre, por lo tanto, si queremos accesar al
constructor de la clase superior debes llamarlo con la palabra super seguidamente pasando los
parametros respectivos
2. Polimorfismo
Recuerde el ejemplo del ecosistema, en donde todos los objetos de las distintas especies
heredaban de una superclase llamada Animal, que brindaba la información general de cualquier
animal, independiente de su especie. Sin embargo, cada especie hace un uso particular de cada
uno de los métodos u operaciones de la clase Animal. El método comer() no se ejecutará de la
misma manera en un León() o en un Pavo(). Lo mismo ocurre para métodos moverse() en objetos
de tipo Tiburón() o Gallina(), aunque todas las especies realicen estos métodos. A la sobrescritura
o implementación específica de métodos es la clave del polimorfismo.
Para poner en práctica se hará un ejemplo bastante sencillo. Se hará una librería de clases que
represente figuras tridimensionales y bidimensionales, y su respectiva jerarquía de clases. Las
clases deben ser capaces de tener funcionamiento bastante básico, como obtener áreas,
volúmenes y perímetros de la figura correspondiente.
Las siguientes clases en el nivel de la jerarquía podrían quedar muy parecidas a éstas:
Se le pide que forme las clases de la parte inferior de la jerarquía y que representarían los objetos a
instanciarse.
Además, debe de realizar una implementación de esta librería, en donde el usuario pueda crear
nuevas figuras y que éstas se almacenen en un arreglo de figuras.
Ejercicios:
• Mediante esa superclase, realice las clases rectángulo, cuadrado, paralelogramo y trapezoide;
que heredarán de ella, convirtiéndose prácticamente en objetos cuadrilátero (superclase).