Java: Constructores y Clases Avanzadas
Java: Constructores y Clases Avanzadas
1
2. Constructores
En Java podemos definir un método que se ejecute inicialmente y en forma automática.
Este método se lo llama constructor.
Ejemplo:
import [Link];
public class Operarios {
private Scanner teclado;
private int[] sueldos;
public Operarios()
{
teclado=new Scanner([Link]);
sueldos=new int[5];
for(int f=0;f<5;f++) {
[Link]("Ingrese valor de la componente:");
sueldos[f]=[Link]();
}
}
Como podemos ver es el mismo problema que resolvimos cuando vimos vectores. La
diferencia es que hemos sustituido el método cargar con el constructor:
public Operarios()
{
teclado=new Scanner([Link]);
sueldos=new int[5];
for(int f=0;f<5;f++) {
[Link]("Ingrese valor de la componente:");
2
sueldos[f]=[Link]();
}
}
[Link]();
Ejercicios
7.1. Plantear una clase llamada Alumno y definir como atributos su nombre y su edad. En
el constructor realizar la carga de datos. Definir otros dos métodos para imprimir los datos
ingresados y un mensaje si es mayor o no de edad (edad >=18)
7.2. Plantear una clase TablaMultiplicar. Definir dos constructores uno con un parámetro
que llegue un entero indicando que tabla queremos ver y otro con dos enteros que indique
el primero que tabla queremos ver y el segundo parámetro indica cuantos términos
mostrar.
7.3. Confeccionar una clase que represente un empleado. Definir como atributos su
nombre y su sueldo. En el constructor cargar los atributos y luego en otro método
imprimir sus datos y por último uno que imprima un mensaje si debe pagar impuestos (si
el sueldo supera a 3000)
3. La clase String
Manipular cadenas de caracteres en Java es bastante simple, pues el lenguaje nos
proporciona clases específicas para trabajar con ellas y lo hacemos a través de los métodos
que poseen cada clase.
La API de Java posee varias clases para la manipulación de cadenas y caracteres, la más
conocida es la clase String.
3
Un objeto del tipo String es un Array que representa una cadena alfanumérica que
contiene un valor constante y NO se puede modificar luego de creado.
Con el método String en Java podemos obtener la ubicación de una letra dentro de la
cadena, la longitud que tiene un grupo de caracteres, una porción de una cadena o palabra,
ordenarlas de menor a mayor y viceversa, y muchas otras tareas.
Para poder realizar todas estas acciones Java nos ofrece una buena cantidad de métodos
para esta clase.
Los métodos predeterminados que posee String nos dan la posibilidad de realizar
muchas cosas, aquí presentamos algunos de ellos:
4
5
6
Ejemplo
Confeccionar una clase que solicite el ingreso de dos String y luego emplee los métodos
más comunes de la clase String.
import [Link];
public class Cadena1 {
public static void main(String[] ar) {
Scanner teclado=new Scanner([Link]);
String cad1;
String cad2;
[Link]("Ingrese la primer cadena:");
cad1=[Link]();
[Link]("Ingrese la segunda cadena:");
cad2=[Link]();
if ([Link](cad2)==true) {
[Link](cad1+" es exactamente igual a "+cad2);
} else {
[Link](cad1+" no es exactamente igual a
"+cad2);
}
if ([Link](cad2)==true) {
[Link](cad1+" es igual a "+cad2+" sin tener en
cuenta mayúsculas/minúsculas");
} else {
[Link](cad1+" no es igual a "+cad2+" sin tener
en cuenta mayúsculas/minúsculas");
}
if ([Link](cad2)==0) {
[Link](cad1+" es exactamente igual a "+cad2);
} else {
if ([Link](cad2)>0) {
[Link](cad1+ " es mayor alfabéticamente
que "+cad2);
} else {
[Link](cad2+ " es mayor alfabéticamente
que "+cad1);
}
}
char carac1=[Link](0);
[Link]("El primer caracter de "+cad1+" es
"+carac1);
int largo=[Link]();
[Link]("El largo del String "+cad1+" es "+largo);
String cad3=[Link](0,3);
[Link]("Los primeros tres caracteres de "+cad1+"
son "+cad3);
int posi=[Link](cad2);
if (posi==-1) {
[Link](cad2+" no está contenido en "+cad1);
} else {
[Link](cad2+" está contenido en "+cad1+" a
partir de la posición "+posi);
}
[Link](cad1+ " convertido a mayúsculas es
"+[Link]());
[Link](cad1+ " convertido a minúsculas es
"+[Link]());
}
}
7
Ejercicios
7.5. Realizar una clase, que permita cargar una dirección de mail en el constructor, luego
en otro método mostrar un mensaje si contiene el carácter '@'.
7.7. Desarrollar un programa que solicite la carga de una clave. La clase debe tener dos
métodos uno para la carga y otro que muestre si la clave es la correcta (la clave a comparar
es "123abc")
7.8. Confeccionar un programa que permita cargar los nombres de 5 personas y sus mail,
luego implementar los siguientes métodos:
7.9. Codifique un programa que permita cargar una oración por teclado, luego mostrar
cada palabra ingresada en una línea distinta.
Ejemplo 3
Un banco tiene 3 clientes que pueden hacer depósitos y extracciones. También el banco
requiere que al final del día calcule la cantidad de dinero que hay depositada.
8
Cliente
atributos
nombre
montante
métodos
constructor
depositar
extraer
retornarMontante
Banco
atributos
3 Cliente (3 objetos de la clase Cliente)
métodos
constructor
operar
depositosTotales
Creamos un proyecto Proyecto1 y dentro del proyecto creamos dos clases llamadas:
Cliente y Banco.
public Banco() {
cliente1=new Cliente("Juan");
cliente2=new Cliente("Ana");
cliente3=new Cliente("Pedro");
}
9
[Link] (100);
[Link] (150);
[Link] (200);
[Link] (150);
}
Los atributos de una clase normalmente son privados para que no se tenga acceso
directamente desde otra clase, los atributos son modificados por los métodos de la
misma clase:
Los métodos depositar y extraer actualizan el atributo montante con el dinero que llega
como parámetro (para simplificar el problema no hemos validado que cuando se extrae
dinero el atributo montante quede con un valor negativo):
10
return montante;
}
Por último el método imprimir muestra nombre y el montante de dinero del cliente:
Como podemos observar la clase Cliente no tiene función main. Entonces donde
definimos objetos de la clase Cliente?
La respuesta a esta pregunta es que en la clase Banco definimos tres objetos de la clase
Cliente.
En le constructor creamos los tres objetos (cada vez que creamos un objeto de la clase
Cliente debemos pasar a su constructor el nombre del cliente, recordemos que su
montante de depósito se inicializa con cero):
public Banco() {
cliente1=new Cliente("Juan");
cliente2=new Cliente("Ana");
cliente3=new Cliente("Pedro");
}
El método operar del banco (llamamos a los métodos depositar y extraer de los
clientes):
11
}
Por último, en la main definimos un objeto de la clase Banco (la clase Banco es la clase
principal en nuestro problema):
Ejercicios
7.10. Plantear un programa que permita jugar a los dados. Las reglas de juego son: se
tiran tres dados si los tres salen con el mismo valor mostrar un mensaje que "gano", sino
"perdió".
Dado
atributos
valor
métodos
tirar
imprimir
retornarValor
JuegoDeDados
atributos
3 Dado (3 objetos de la clase Dado)
métodos
constructor
jugar
Creamos un proyecto Proyecto2 y dentro del proyecto creamos dos clases llamadas:
Dado y JuegoDeDados.
12
5. Sobrecarga de métodos y constructores
Se le llama sobrecarga de funciones o métodos a la creación de varias funciones dentro
de nuestro programa, que tienen el mismo nombre, pero sus argumentos son distintos y
realizan distinta acción.
Básicamente sobrecargar significa definir nuevos métodos con parámetros distintos para
ampliar las funcionalidades del método original, manteniendo la calidad en el código,
reutilizando las funciones, sin extender la cantidad de líneas en nuestro programa.
Es posible porque Java nos permite utilizar la sobrecarga, y la ventaja principal de esta es
la flexibilidad a la hora de usar un método ya creado, pero con diferente tipo de datos,
para obtener otro resultado.
Dependiendo de los tipos y la cantidad de argumentos, Java puede identificar cuál de los
métodos existentes debe utilizar.
Esto significa que para sobrecargar una función o método, al llamarla debemos cambiar
el tipo y / o número de argumentos, este proceso se conoce como method overloading.
Se puede utilizar la palabra reservada this para llamar a un constructor desde otro. La llamada this
debe ser la primera línea de dicho constructor.
Realizar un programa en Java que permita calcular el pedido que realiza un cliente en un
restaurante.
Cada uno de dichas partes tiene un nombre y un valor. Se requiere definir métodos
sobrecargados para calcular el valor del pedido dependiendo si el cliente solicita:
Un primer plato y una bebida.
Un primer plato, un segundo plato y una bebida.
Un primer plato, un segundo plato, una bebida y un postre.
Implementar un método main que utilice los tres métodos sobrecargados en tres
diferentes pedidos.
13
public class Pedido {
public void calcularPedido(String primerPlato, double
costoPrimerPlato, String bebida, double costoBebida) {
double total = costoPrimerPlato + costoBebida;
[Link]("El costo de " + primerPlato + " y " + bebida +
" es = $" + total);
}
public void calcularPedido(String primerPlato, double
costoPrimerPlato, String segundoPlato, double costoSegundoPlato,
String bebida, double costoBebida) {
double total = costoPrimerPlato + costoSegundoPlato +costoBebida;
[Link]("El costo de " + primerPlato + " el del segundo
" + segundoPlato + " y bebida " + bebida + " es = $" + total);
}
public void calcularPedido(String primerPlato, double
costoPrimerPlato, String segundoPlato, double costoSegundoPlato,
String postre, double costoPostre, String bebida, double costoBebida)
{
double total = costoPrimerPlato + costoSegundoPlato + costoBebida
+ costoPostre;
[Link]("El costo de " + primerPlato + " + " +
segundoPlato + " + " + bebida + " + " + postre + " es = $" + total);
}
}
Ejercicios
7.12. Definir una clase denominada Suma, la cual tiene varios métodos sumar
sobrecargados:
• Un método sumar que obtiene la suma de dos valores enteros pasados como
parámetros.
• Un método sumar que obtiene la suma de tres valores enteros pasados como
parámetros.
• Un método sumar que obtiene la suma de dos valores double pasados como
parámetros.
• Un método sumar que obtiene la suma de tres valores double pasados como
parámetros.
14
Ejemplo 6 Sobrecarga de constructores
Realizar un programa en Java que permita modelar un artículo científico. Los artículos
científicos contienen los siguientes metadatos: nombre del artículo, autor, palabras claves,
nombre de la publicación, año y resumen.
Ejercicios
7.13. Definir una clase Empleado que tiene como atributos: identificador, nombre,
apellidos y edad del empleado. La clase contiene dos constructores:
• El primer constructor no tiene parámetros e inicializa los atributos del objeto con los
siguientes valores: identificador del empleado con el valor 100, el nombre con “Nuevo
empleado”, apellidos con “Nuevo empleado” y edad del empleado con 18.
• El segundo constructor asigna valores a los atributos de acuerdo con los valores
pasados como parámetros.
6. Herencia
Vimos en el concepto anterior que dos clases pueden estar relacionadas por la
colaboración. Ahora veremos otro tipo de relaciones entre clases que es la Herencia.
La herencia significa que se pueden crear nuevas clases partiendo de clases existentes,
que tendrá todas los atributos y los métodos de su 'superclase' o 'clase padre' y además
se le podrán añadir otros atributos y métodos propios.
clase padre
Clase de la que desciende o deriva una clase. Las clases hijas (descendientes) heredan
(incorporan) automáticamente los atributos y métodos de la la clase padre.
Subclase
15
Clase desciendiente de otra. Hereda automáticamente los atributos y métodos de su
superclase. Es una especialización de otra clase. Admiten la definición de nuevos
atributos y métodos para aumentar la especialización de la clase.
Vehiculo
Ford Renault
Siempre hacia abajo en la jerarquía hay una especialización (las subclases añaden
nuevos atributos y métodos.
Software
Aplicacion Base
El primer tipo de relación que habíamos visto entre dos clases, es la de colaboración.
Recordemos que es cuando una clase contiene un objeto de otra clase como atributo.
Cuando la relación entre dos clases es del tipo "...tiene un..." o "...es parte de...", no
debemos implementar herencia. Estamos frente a una relación de colaboración de clases
no de herencia.
Si tenemos una ClaseA y otra ClaseB y notamos que entre ellas existe una relación de
tipo "... tiene un...", no debe implementarse herencia sino declarar en la clase ClaseA un
atributo de la clase ClaseB.
Por ejemplo: tenemos una clase Auto, una clase Rueda y una clase Volante. Vemos que
la relación entre ellas es: Auto "...tiene 4..." Rueda, Volante "...es parte de..." Auto; pero
la clase Auto no debe derivar de Rueda ni Volante de Auto porque la relación no es de
tipo-subtipo sino de colaboración. Debemos declarar en la clase Auto 4 atributos de tipo
Rueda y 1 de tipo Volante.
Luego si vemos que dos clase responden a la pregunta ClaseA "..es un.." ClaseB es
posible que haya una relación de herencia.
Por ejemplo:
16
Ejemplo
Supongamos que necesitamos implementar dos clases que llamaremos Suma y Resta.
Cada clase tiene como atributo valor1, valor2 y resultado. Los métodos para definir son
cargar1 (que inicializa el atributo valor1), carga2 (que inicializa el atributo valor2),
operar (que en el caso de la clase "Suma" suma los dos atributos y en el caso de la clase
"Resta" hace la diferencia entre valor1 y valor2, y otro método mostrarResultado.
Si analizamos ambas clases encontramos que muchos atributos y métodos son idénticos.
En estos casos es bueno definir una clase padre que agrupe dichos atributos y
responsabilidades comunes.
Operacion
Suma Resta
Solamente el método operar es distinto para las clases Suma y Resta (esto hace que no
lo podamos disponer en la clase Operacion), luego los métodos cargar1, cargar2 y
mostrarResultado son idénticos a las dos clases, esto hace que podamos disponerlos en
la clase Operacion. Lo mismo los atributos valor1, valor2 y resultado se definirán en la
clase padre Operacion.
Crear un proyecto y luego crear cuatro clases llamadas: Operacion, Suma, Resta y
Prueba
import [Link];
public class Operacion {
protected Scanner teclado;
protected int valor1;
protected int valor2;
protected int resultado;
public Operacion() {
teclado=new Scanner([Link]);
}
17
}
import [Link];
public class Operacion {
protected Scanner teclado;
protected int valor1;
protected int valor2;
protected int resultado;
Ya veremos que definimos los atributos con este nuevo modificador de acceso
(protected) para que la subclase tenga acceso a dichos atributos. Si los definimos private
las subclases no pueden acceder a dichos atributos.
public Operacion() {
teclado=new Scanner([Link]);
}
18
Ahora veamos como es la sintaxis para indicar que una clase hereda de otra:
void operar() {
resultado=valor1+valor2;
}
El método operar puede acceder a los atributos heredados (siempre y cuando los
mismos se declaren protected, en caso que sean private si bien lo hereda de la clase
padre solo los pueden modificar métodos de dicha clase padre.
Ahora podemos decir que la clase Suma tiene cinco métodos (cuatro heredados y uno
propio) y 3 atributos (todos heredados)
Podemos llamar tanto al método propio de la clase Suma "operar()" como a los métodos
heredados. Quien utilice la clase Suma solo debe conocer que métodos públicos tiene
(independientemente que pertenezcan a la clase Suma o a una clase superior)
19
Ejercicios
7.14. Confeccionar una clase Persona que tenga como atributos el nombre y la edad.
Definir como responsabilidades un método que cargue los datos personales y otro que
los imprima.
Plantear una segunda clase Empleado que herede de la clase Persona. Añadir un atributo
sueldo y los métodos de cargar el sueldo e imprimir su sueldo.
Definir un objeto de la clase Persona y llamar a sus métodos. También crear un objeto
de la clase Empleado y llamar a sus métodos.
7.15. La empresa informática “IPM Tech” necesita llevar un registro de todos sus
empleados que se encuentran en la oficina central, para eso ha creado un diagrama de
clases que debe incluir lo siguiente:
• Empleado
Atributos:
- nombre: tipo cadena (Debe ser nombre y apellido)
- cedula: tipo cadena
- edad : entero (Rango entre 18 y 45 años)
- casado: boolean
- salario: tipo numérico doble
Métodos:
- Constructor con y sin parámetros de entrada
- Método que permita mostrar la clasificación según la edad de acuerdo al
siguiente algoritmo: Si edad es menor o igual a 21, Principiante. Si edad es
>=22 y <=35, Intermedio. Si edad es >35, Senior.
- Imprimir los datos del empleado por pantalla (utilizar salto de línea \n para
separar los atributos.
- Un método que permita aumentar el salario en un porcentaje que sería pasado
como parámetro al método.
Atributos:
- lineasDeCodigoPorHora : tipo entero
- lenguajeDominante: tipo cadena
Metodos:
- Constructor con y sin parámetros de entrada.
20
21
7. Enumerados
Los enum en Java, llamados también enumeraciones o listado específico, se refieren a la
herramienta que permite representar conjuntos de constantes con un nombre en el
lenguaje de programación.
22
Ejemplo
Escriba un programa que defina un enumerado para los días de la semana. En el programa
defina una variable del enumerado y asígnele el valor del día que corresponde al martes.
A continuación, escriba por pantalla dicha variable y escriba el valor del enumerado
correspondiente al domingo.
Escriba un enumerado para los tipos de lavado de un túnel de lavado que guarde la
información de los tiempos. Los tipos de lavado son básico, normal y super y el tiempo
que se tarda en cada uno es de 3, 5 y 8 minutos, respectivamente. Escriba un programa
que muestre su funcionamiento.
23
return tiempo;
}
}
Métodos abstractos
En una clase abstracta es posible definir métodos abstractos, los cuales se caracterizan
por el hecho de que no pueden ser implementados en la clase base. De ellos, solo se
escribe su signatura en la superclase, y su funcionalidad –polimórfica– tiene que indicarse
en las clases derivadas (subclases).
Ejemplo
24
super(color);
[Link] = lado;
}
Por otro lado, véase que, en cada una de las subclases (Cuadrado y Triangulo) se ha
implementado dicho método.
import [Link];
25
colorDelCuadrado = [Link]();
import [Link];
Ejercicios
26
public abstract String getHábitat()
7.17. En una carrera ciclística, un equipo está conformado por un conjunto de ciclistas y se
identifica por el nombre del equipo (tipo String), la suma de los tiempos de carrera de sus
ciclistas en minutos (atributo estático) y país del equipo. Sus atributos deben ser privados.
Un ciclista es una clase abstracta que se describe con varios atributos: identificador (de tipo
int), nombre del ciclista y tiempo acumulado de carrera (en minutos, con valor inicial cero).
Los atributos deben ser privados. Un ciclista tiene un método abstracto imprimirTipo que
devuelve un String.
Los ciclistas se clasifican de acuerdo con su especialidad (sus atributos deben ser privados
y sus métodos protegidos). Estas especialidades no son clases abstractas y heredan los
siguientes aspectos de la clase Ciclista:
Velocista: tiene nuevos atributos como potencia promedio (en vatios) y
velocidad promedio en sprint (Km/h) (ambos de tipo double).
Escalador: tiene nuevos atributos como aceleración promedio en subida (m/s2)
y grado de rampa soportada (grados) (ambos de tipo float).
Contrarrelojista: tiene un nuevo atributo, velocidad máxima (km/h).
Definir clases y métodos para el ciclista y sus clases hijas para realizar las siguientes
acciones:
Constructores para cada clase (deben llamar a los constructores de la clase
padre en las clases donde se requiera).
Métodos get y set para cada atributo de cada clase.
Imprimir los datos de un ciclista. Debe invocar el método de la clase padre e
imprimir los valores de los atributos propios.
Método imprimirTipo que devuelve un String con el texto “Es un xxx”. Donde xxx
es la clase a la que pertenece.
27
En una clase de prueba, en un método main se debe crear un equipo y agregar ciclistas de
diferentes tipos.
9. Polimorfismo.
El polimorfismo es una de las características fundamentales de la Programación
Orientada a Objetos y está estrechamente relacionado con la herencia.
Una jerarquía de clases, los métodos y clases abstractas, la sobrescritura de métodos y las
conversiones entre clases de la jerarquía sientan las bases para el polimorfismo. Es
necesario entender bien estos conceptos para comprender el polimorfismo. En esta
entrada se explican y se ven algunos ejemplos de herencia.
El polimorfismo se puede definir como la cualidad que tienen los objetos para responder
de distinto modo a un mismo mensaje.
Ejemplo 1
¿Cuál es el resultado de la ejecución del siguiente programa?
Clase: Profesor
public class Profesor {
/**
* Método que imprime en pantalla un texto específico identificando *
que el objeto es un Profesor
*/
protected void imprimir() {
[Link](“Es un profesor.”);
}}
Clase: ProfesorTitular
public class ProfesorTitular extends Profesor {
/**
* Método que sobreescribe el método imprimir heredado de la clase *
padre Profesor
*/
protected void imprimir() {
[Link](“Es un profesor titular.”);
}
}
Clase: Prueba
28
/**
* Método main que crea un Profesor pero instanciando la clase *
ProfesorTitular. ¿Qué se imprimirá en pantalla?
*/
public static void main(String[] args) {
Profesor profesor1 = new ProfesorTitular();
[Link]();
}
}
Ejemplo 2
public Poligono() {
}
Esta clase tiene un atributo entero numLados. Además contiene el método abstracto area()
y se ha modificado (Override) el método toString() heredado de Object.
29
A partir de la clase Poligono vamos a crear las clases Rectangulo y Triangulo como
derivadas de ella.
public Rectangulo() {
}
30
public double getLado1() {
return lado1;
}
Vamos a escribir un programa para utilizar estas clases y ver como funciona el
polimorfismo. Vamos a crear objetos de tipo Triángulo y Rectángulo y los guardaremos
en un ArrayList. En lugar de tener dos arrays distintos uno para triángulos y otro para
rectángulos, los guardaremos todos juntos utilizando un ArrayList de Poligonos.
El programa creará objetos, leerá sus datos por teclado y los guardará en el ArrayList de
Polígonos. A continuación, se recorrerá el array y se mostrarán los datos de cada objeto
y su área.
//Clase Principal
public class Polimorfismo1 {
31
public static void main(String[] args) {
leerPoligonos();
mostrarPoligonos();
}
32
[Link]("Longitud del lado 2: ");
l2 = [Link]();
} while (l2 <= 0);
do {
[Link]("Longitud del lado 3: ");
l3 = [Link]();
} while (l3 <= 0);
Triangulo t = new Triangulo(l1, l2, l3);
[Link](t);
//conversión implícita o upcasting igual que en el método
anterior
}
[Link]([Link]());
[Link](" area: %.2f %n", [Link]());
}
}
}
for(Poligono p: poligonos)
se recorre el array y se asigna a la variabale p de tipo Poligono (Clase base) cada elemento
del array. En la instrucción [Link]() mediante p se invoca al método toString(). Pero
¿a qué método toString se ejecutará? Se ejecutará el método toString de las clase derivada
a la que pertenece el objeto referenciado por la variable p (Triangulo o Rectangulo)
33
ejecuta la versión del método correspondiente a la clase del objeto referenciado y no al
de la clase de la variable que lo referencia.
Por lo tanto, el método que se ejecuta se decide durante la ejecución del programa.
10. Interfaces
Una interfaz es una declaración de métodos no estáticos y campos estáticos finales cuyo
fin es definir la estructura y comportamiento de las clases que la implementen de forma
que presenten la misma interfaz pública.
Los elementos de una interfaz son públicos por definición: no es necesario poner la
palabra public, ni se pueden cambiar sus derechos de acceso.
Los atributos siempre son finales, sin necesidad del calificativo final, y hay que darles
un valor inicial.
Dada una interfaz, cualquier clase puede presentar dicha interfaz mediante un
mecanismo denominado
34
class NombreClase implements Nombrelnterfaz { ... }
Cuando una clase implemente una interfaz, tendrá que sobrecargar sus métodos con
acceso público. Con otro tipo de acceso, el compilador lanzará un error.
Ejemplo:
Para ello se va a definir una interfaz de nombre Docente con las operaciones
ponGrupo(), dameGrupo() y dameHorario(). Para los no docentes estas operaciones no
tienen sentido. Sin embargo, sí es cierto que todos los alumnos, profesores, bedeles, etc,
son personas (es decir se pueden crear como derivadas de la clase Persona). De esta
forma se puede escribir:
interface Docente {
void ponGrupo(String grupo. Horario horario);
String dameGrupo();
Horario dameHorario();
}
35
}
}
}
class Bedel extends Empleado { ... }
La línea anterior declara una clase ClaseA que implementa las interfaces InterfaceB e
InterfaceC.
Si alguno de los métodos queda sin implementar, la clase es abstracta. En ese caso, es
necesario definirlo de forma explícita, añadiendo el calificativo abstract a la clase y
añadiendo la cabecera del método que se deja sin implementar anteponiendo a su vez el
calificativo abstract. De esta forma queda patente que se está definiendo una
implementación parcial, con la intención de que al programador no se le pasen cosas
desapercibidas. Una interfaz puede heredar de tantas interfaces como sea necesario. Lo
que consigue añadir nuevos métodos a los existentes en las interfaces de las que hereda.
Una clase que implemente esta interfaz, tiene que implementar todos los métodos
declarados en ella, además de los heredados de las otras.
Ejercicio:
a) Las características comunes que se almacenan tanto para las revistas como para
los libros son el código, el titulo y el año de publicación. estas tres
características se pasan como parámetros en el momento de crear los objetos.
b) Lis libros tienen además un atributo prestado. Los libros cuando se crean no
están prestados.
c) Las revistas tienen un número. En el momento de crear las revistas se pasa el
número por parámetro.
d) Tanto las revistas como los libros deben tener aparte de los constructores un
método toString() que devuelva el valor de todos los atributos en una cadena de
caracteres. También tienen un método que devuelve el año de publicación y otro
para el código.
e) Para prevenir posibles cambios en el programa se tienen que implementar una
interfaz Prestable con los métodos prestar (), devolver() y prestado(). La clase
libro implementa esa interfaz.
36
• Escriba una aplicación en la que se implementen dos métodos:
11. Genéricos
Los métodos genéricos en Java y las clases genéricas permiten a los programadores
especificar, con una única declaración de método, un conjunto de métodos relacionados,
o con una única declaración de clase, un conjunto de tipos relacionados,
respectivamente.
Métodos genéricos
Puede escribir una única declaración de método genérico que se puede llamar con
argumentos de diferentes tipos. En función de los tipos de argumentos pasados al
método genérico, el compilador maneja cada llamada de método de manera apropiada.
Las siguientes son las reglas para definir métodos genéricos:
37
• El cuerpo de un método genérico se declara como el de cualquier otro método.
Tenga en cuenta que los parámetros de tipo solo pueden representar tipos de
referencia (Integer, String, etc), no tipos primitivos (como int, double y char).
Ejercicio:
38