1. Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 1
Maestría en Sistemas Computacionales
Materia
TECNOLOGÍAS DE PROGRAMACIÓN
3. Herencia, Polimorfismo,3. Herencia, Polimorfismo,
Interfaces y Clases Abstractas.Interfaces y Clases Abstractas.
semestre agosto – diciembre 2012
Instituto Tecnológico de la Laguna
División de Estudios de Posgrado e Investigación
2. Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 2
Objetivo: Descripción de conceptos
relevantes en el POO: herencia, interfaces,
clases abstractas y polimorfismo.
Contenido
3.1 Herencia.
3.2 Polimorfismo
3.3 Interfaces.
3.4 Clases abstractas.
3.3. Interfaces, Clases Abstractas yInterfaces, Clases Abstractas y
Polimorfismo.Polimorfismo.
3. 3.1 Herencia
El concepto de Herencia nos
enseña que podemos crear una
nueva clase a partir de una
clase existente: se reutilizan (o
heredan) sus métodos y campos
y se añaden nuevos métodos y
campos para adaptar la nueva
clase a nuevas situaciones.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 3
4. 3.1 Herencia
La clase existente se denomina
superclase, clase base o clase padre.
La nueva clase se denomina subclase,
clase derivada o clase hija.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 4
Empleado
Ejecutivo
Administrador Secretario Programadora
superclase
subclase
5. 3.1 Herencia
Ejemplo: La clase Administrador hereda de
la clase Empleado.
class Administrador extends Empleado
{ private double incentivo;
public void setIncentivo(double incent)
{
incentivo=incent;
}
}
Para indicar la herencia se emplea la
palabra reservada extends.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 5
6. 3.1 Herencia
Note que:
Si se tiene un objeto Empleado no se
le puede aplicar el método
setIncentivo().
Sin embargo, si se tiene un objeto
Administrador se le pueden aplicar los
métodos getNombre() y
getFechaContrato(). Estos métodos
se heredan automáticamente de la
superclase Empleado.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 6
7. 3.1 Herencia
De igual manera, los campos nombre,
sueldo y fechaContrato se heredan de
la superclase. De tal forma que todo
objeto Administrador posee cuatro
campos: nombre, fechaContrato,
sueldo e incentivo.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 7
8. 3.1 Herencia
Ejemplo: Nuevo método de la subclase que
invalida el método de la superclase.
class Administrador extends Empleado
{ private double incentivo;
public void setIncentivo(double incent)
{
incentivo=incent;
}
public double getSueldo()
{
double sueldoBase = super.getSueldo();
return (sueldoBase + incentivo);
}
}
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 8
9. 3.1 Herencia
Es importante hacer notar que las
subclases pueden añadir campos y
pueden añadir o invalidar métodos de
la superclase. Sin embargo, la
herencia no tiene la posibilidad de
añadir ni eliminar campos o métodos.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 9
10. 3.1 Herencia
Ejemplo: Creación de un constructor en la
subclase.
class Administrador extends Empleado
{ private double incentivo;
public Administrador(String n, double s, int aa, int mm, ind dd)
{ super(n, s, aa, mm, dd);
incentivo = 0;
}
public void setIncentivo(double incent)
{ incentivo=incent;
}
public double getSueldo()
{ double sueldoBase = super.getSueldo();
return (sueldoBase + incentivo);
}
}
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 10
11. 3.1 Herencia
El constructor de la subclase Administrador
no tiene acceso a los campos private de la
superclase Empleado.
La instrucción:
super(n, s, aa, mm, dd);
realiza la llamada al constructor de la
superclase Empleado.
La llamada que usa super debe ser la
primer instrucción que aparezca en el
constructor de la subclase.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 11
12. 3.1 Herencia
super es una palabra reservada especial que dirige
al compilador para que invoque al método de la
superclase.
Si el constructor de la subclase no llama
explícitamente a un constructor de la superclase,
entonces se invoca al constructor predeterminado
(sin parámetros) de la superclase.
Si la superclase no posee un constructor
predeterminado y el constructor de la subclase no
llama explícitamente a otro constructor de la
superclase, entonces el compilador de Java nos
avisa que hubo un error.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 12
13. 3.1 Herencia
Ejemplo:
public class Bicicleta{
// la clase Bicicleta tiene tres campos
public int cambios;
public int rodada;
public int velocidad;
// la clase Bicicleta tiene un constructor
public Bicicleta(int iniciaCambios, int iniciaRodada, int iniciaVelocidad)
{
cambios = iniciaCambios;
rodada = iniciaRodada;
velocidad = iniciaVelocidad;
}
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 13
14. 3.1 Herencia
// la clase Bicicleta tiene cuatro metodos
public void setCambios(int newValue) {
cambios = newValue;
}
public void setRodada(int newValue) {
rodada = newValue;
}
public void aplicaFreno(int decremento) {
velocidad -= decremento;
}
public void aumentaVelocidad(int incremento) {
velocidad += incremento;
}
}
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 14
15. 3.1 Herencia
public class BiciDeMontana extends Bicicleta{
// la subclase BiciDeMontana agrega un campo
public int alturaAsiento;
// la subclase BiciDeMontana tiene un constructor
public BiciDeMontana (int iniciaAlturaAsiento, int iniciaCambios,
int iniciaRodada, int iniciaVelocidad)
{
super(iniciaCambios, iniciaRodada, iniciaVelocidad) ;
alturaAsiento = iniciaAlturaAsiento;
}
// la subclase BiciDeMontana agrega un método
public void setAlturaAsiento(int newValue) {
alturaAsiento = newValue;
}
}
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 15
16. 3.2 Polimorfismo
El hecho de que una variable de
objeto pueda en realidad hacer
referencia a múltiples tipos
distintos se denomina
polimorfismo.
La selección automática del método
correcto durante la ejecución se
denomina enlace dinámico.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 16
17. 3.2 Polimorfismo
Ejemplo: Creación de un nuevo Administrador y
dos Empleados.
Administrador jefe = new Administrador(“José López”, 50000, 1987,
12, 15);
jefe.setIncentivo(5000);
Empleado [] personal = new Empleado[3];
personal[0] = jefe;
personal[1] = new Empleado (“María Pérez”, 30000, 1989, 10, 1);
personal[2] = new Empleado (“Miguel Ríos”, 20000, 1990, 3, 15);
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 17
18. 3.2 Polimorfismo
Para imprimir el sueldo de todos:
for(Empleado e : personal)
System.out.println(e.getNombre() + ” ” + e.getSueldo());
Este bucle imprime:
José López 55000.0
María Pérez 30000.0
Miguel Ríos 20000.0
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 18
19. 3.2 Polimorfismo
personal[1] y personal[2] imprimen su sueldo base
porque son objetos de tipo Empleado.
personal[0] es un objeto de tipo Administrador y su
método getSueldo añade el incentivo al sueldo base.
La llamada
e.getSueldo());
invoca al método de la clase Empleado cuando e se
refiere a un objeto de tipo Empleado. Cuando e se
refiere a un objeto de tipo Administrador se invoca al
método getSueldo de la clase Administrador. Esto es
polimorfismo.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 19
20. 3.2 Polimorfismo
La llamada al método adecuado se realiza en tiempo de
ejecución (enlazado dinámico).
En el momento de ejecución, la llamada a e.getSueldo()
se resuelve de la siguiente manera:
1. La máquina virtual examina la tabla de métodos en busca del
tipo de e. Puede tratarse se la tabla de métodos de Empleado,
Administrador, u otra subclase de Empleado.
2. Entonces, la máquina virtual examina la clase en que se define,
en busca de la signatura de getSueldo(). Ahora ya sabe el
método al que debe llamar.
3. Por último, la máquina virtual llama al método.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 20
21. Clases y métodos finales
Cuando se desea evitar que alguien
construya una subclase a partir de una
de nuestras clases podemos utilizar el
modificador final en la definición de la
clase.
Por ejemplo, deseamos evitar que otros
construyan subclases de la clase
Ejecutivo, declaramos la clase:
final class Ejecutivo extends administrador
{
…
}
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 21
22. Si se desea que ninguna subclase
pueda invalidar un método, el método
se debe declarar usando el
modificador final:
Class Empleado
{ . . .
public final String getNombre()
{
return nombre;
}
. . .
}
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 22
23. Todos los métodos de una clase final son final
automáticamente.
Solo hay una buena razón para hacer final un
método o una clase: asegurarse de que su
semántica no se pueda modificar en una
subclase.
Por ejemplo los métodos getTime y setTime de
la clase Calendar son final. La clase Calendar se
hace cargo de la responsabilidad de efectuar
conversiones entre la clase Date y el estado del
calendario.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 23
24. Conversión de referencia de un
objeto de una clase a otra.
Se le llama typecasting o refundición.
Este proceso consiste en forzar la
conversión de un tipo a otro.
Podemos transformar un número de
punto flotante en un entero:
double x = 3.405;
int nx = (int) x;
transforma el valor de la expresión x
en un entero, descartando su parte
fraccionaria.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 24
25. Conversión de referencia de un
objeto de una clase a otra.
También podemos convertir una
referencia de objeto de una clase a
otra. Por ejemplo:
Administrador jefe = (Administrador) personal[0]; // correcto
Administrador jefe = (Administrador) personal[1]; // error
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 25
26. Conversión de referencia de un
objeto de una clase a otra.
instanceof se puede utilizar para
verificar si una refundición va a tener
éxito antes de intentar realizarla.
if (personal[1] instaceof Administrador)
{
Administrador jefe = (Administrador) personal[1];
}
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 26
27. Conversión de referencia de un
objeto de una clase a otra.
En resumen:
Solo se puede refundir dentro de una
jerarquía de herencia.
Utilice instanceof para probar antes
de hacer una refundición de una
superclase a una subclase.
Puede emplear try y catch con
ClassCastException para manejar el
error de refundición de clases.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 27
28. EJEMPLO. FUENTE:
http://www.javabeginner.com/learn-java/java-object-typecasting
class Vehicle
{ String name;
Vehicle() { name = "Vehicle"; }
}
class HeavyVehicle extends Vehicle
{ HeavyVehicle() { name = "HeavyVehicle"; }
}
class Truck extends HeavyVehicle
{ Truck() { name = "Truck"; }
}
class LightVehicle extends Vehicle
{ LightVehicle() { name = "LightVehicle"; }
}
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 28
29. FUENTE:
http://www.javabeginner.com/learn-java/java-object-typecasting
public class InstanceOfExample
{ static boolean result;
static HeavyVehicle hV = new HeavyVehicle();
static Truck T = new Truck();
static HeavyVehicle hv2 = null;
public static void main(String[] args)
{ result = hV instanceof HeavyVehicle;
System.out.print("hV is an HeavyVehicle: " + result + "n");
result = T instanceof HeavyVehicle;
System.out.print("T is an HeavyVehicle: " + result + "n");
result = hV instanceof Truck;
System.out.print("hV is a Truck: " + result + "n");
result = hv2 instanceof HeavyVehicle;
System.out.print("hv2 is an HeavyVehicle: " + result + "n");
hV = T; //Sucessful Cast form child to parent
T = (Truck) hV; //Sucessful Explicit Cast form parent to child
}
}
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 29
32. 3.3 Interfaces
fuente: http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html
En Java, una interfaz es un tipo de
referencia, similar a una clase, que
puede contener solo constantes, y
firmas de métodos. Los métodos no
tienen cuerpo.
Las interfaces no pueden ser
instanciadas, sólo se pueden
implementar en las clases o ser
extendidas por otras interfaces.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 32
33. 3.3 Interfaces
fuente: http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html
Una declaración de una interfaz consiste de
modificadores de acceso, la palabra reservada
interface, el nombre de la interfaz, una lista de
interfaces padre (sí las hay) y el cuerpo de la
interfaz:
public interface GroupedInterface extends Interface1, Interface2,
Interface3 {
// constant declarations
// base of natural logarithms
double E = 2.718282;
// method signatures
void doSomething (int i, double x);
int doSomethingElse(String s);
}
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 33
34. 3.3 Interfaces
fuente: http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html
El especificador de acceso public nos
indica que la interfaz puede ser usada
por cualquier clase en cualquier
paquete. Si no se especifica que la
interfaz es pública, la interfaz sólo será
accesible por las clases que están
definidas en el mismo paquete que la
interfaz.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 34
35. 3.3 Interfaces
fuente: http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html
Una interfaz puede extender de otras
interfaces, al igual que una clase puede
extender o ser subclase de otra clase.
Sin embargo, mientras que una clase
sólo puede extender otra clase, una
interfaz puede extender cualquier
número de interfaces. La declaración de
interfaz incluye una lista separada por
comas de todas las interfaces que se
extiende.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 35
36. El cuerpo de la interfaz contiene
declaraciones de métodos para todos
los métodos incluidos en la interfaz.
Una declaración de método dentro de
una interfaz es seguido por un punto
y coma, pero sin paréntesis, porque
una interfaz no proporciona
implementaciones para los métodos
declarados dentro de ella.
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 36
37. Todos los métodos declarados en una
interfaz son implícitamente públicos, por
lo que el modificador public puede ser
omitido.
Una interfaz puede contener
declaraciones constantes además de
declaraciones de métodos. Todos los
valores constantes definidos en una
interfaz son implícitamente públicos,
estáticos y finales (public, static y final).
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 37
38. 3.4 Clases abstractas
Un empleado es una persona, y
también lo es un alumno.
Extendiendo nuestra jerarquía de
clases para incluir las clases Persona
y Alumno tenemos:
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 38
Persona
Empleado Alumno
39. Tanto los alumnos como los empleados
tienen nombres, y al introducir una
superclase común se nos permite sacar
el método getNombre a un nivel
superior en la jerarquía de herencia.
Añadimos otro método: getDescripcion
con el propósito de proporcionar una
breve descripción de la persona, como:
un empleado con un sueldo de $50,000.00
un alumno que estudia informática
Lina Ernestina Arias Hernández Instituto Tecnológico de la Laguna 39