Tema 4: Herencia y
Polimorfismo
El alumno aplicará las propiedades de la
programación orientada a objetos para la resolución
de problemas y conocerá elementos adicionales para
construir soluciones de Sw.
4.1 Jerarquía de
clases y objetos
4.1.1 Generalidades
Jerarquizar es una capacidad que permite ordenar
abstracciones.
Su principal ventaja consiste en detectar estructuras
y comportamientos comunes y con ello simplificar el
desarrollo.
4.1.1 Generalidades
La jerarquía se puede establecer de acuerdo a la
metodología de diseño:
➢Top-Down
➢Bottom-Up
4.1.2 Jerarquía de clases
• La jerarquía de clase se puede dividir en
generalización y especialización.
• La generalización es la asociación de elementos
comunes dentro de un conjunto de clases en una
clase con el propósito de “agrupar”
Animal
Reptil Mamífero Anfibio
4.1.2 Jerarquía de clases
• La especialización permite diferenciar ya sea a
través de las características o de los
comportamientos de un conjunto de objetos.
Animal
Reptil Mamífero Anfibio
Serpiente Caballo Rana
4.1.3 Jerarquía de objetos
La jerarquía entre objetos se puede clasificar en 2
tipos de relaciones:
✓ Relaciones de asociación
✓ Relaciones de dependencia
Ambos tipos de relaciones se pueden
implementar con la composición de clases
Tarea
• Investigar los tipos de relaciones entre objetos
Relaciones de asociación
Relaciones de dependencia
Relaciones de agregación?
Describir en qué consiste cada una de ellas, cuales
son las diferencias entre ellas
2 ejemplos de cada una
4.2 Herencia
4.2.1 Aspectos básicos de herencia
• La herencia es uno de los elementos distintivos del
paradigma orientado a objetos.
• Se utiliza para establecer jerarquías entre clases.
• Unos de sus objetivos es reducir el código
redundante.
4.2.1 Aspectos básicos de herencia
El principal objetivo de la
herencia es:
• Generalizar la
funcionalidad de una
clase.
• Especializar el
comportamiento de
una clase.
4.2.1 Aspectos básicos de herencia
• Por lo general, cuando se habla de herencia se usan
los términos clase padre o clase base cuando se
refieren a una superclase y términos clase hijo o
clase derivada para referirse a una subclase.
“Confucio inventó la confusión”
4.2.1 Aspectos básicos de herencia
• El “super” en superclase parece implicar que las
superclases tienen más capacidad, y el “sub” en
subclase parece implicar que las subclases tienen
menor capacidad.
• En realidad, ocurre justamente lo contrario: las
subclases tienen más capacidad. Las subclases
pueden hacer todo lo que pueden hacer las
superclases, y aún más.
4.2.1 Aspectos básicos de herencia
• Una clase ancestro se refiere a cualquiera de las
clases por arriba de una clase particular en una
jerarquía de la herencia.
• Una clase descendiente se refiere a cualquiera de
las clases por abajo de una clase particular en una
jerarquía de la herencia
4.2.1 Aspectos básicos de herencia
4.2.1 Aspectos básicos de herencia
• Una clase base puede serlo de tantas derivadas
como se desee: Una sola super clase, varias
subclases.
4.2.2. Herencia múltiple
Herencia múltiple
Java no permite la herencia múltiple.
4.2.3 Implementación de herencia
4.2.3 Implementación de herencia
Clases derivadas
• Contiene los componentes (atributos y métodos)
de la clase base.
• Los constructores no se heredan. Las clases
derivadas deberán implementar sus propios
constructores.
• Puede modificar el comportamiento de sus propios
métodos (extender la funcionalidad de la clase).
4.2.4 Sobreescritura
• Los métodos heredados de la clase base se pueden
redefinir en las clases derivadas. (también se le
llama modificar o sobreescribir)
• El método en la clase derivada se debe escribir con
el mismo nombre, el mismo número y tipo de
parámetros y el mismo tipo de retorno que en la
clase base.
4.2.4 Sobreescritura
• El método sobrescrito puede tener un modificador
de acceso menos restrictivo que el de la clase base.
• Si por ejemplo el método heredado es protected
se puede redefinir como public pero no como
private porque sería un acceso más restrictivo que
el que tiene en la clase base.
• Cuando se redefine un método, se oculta el de la
clase base y todas las sobrecargas que tenga en
ella.
4.2.5 Instrucción super()
• Esta instrucción (palabra reservada) se ejecuta
cuando se utiliza de manera explicita alguno de los
elementos de la clase padre.
• La instrucción super se utiliza para:
❖ Constructores
❖ Métodos
❖ Atributos
4.2.5 Instrucción super()
• Los constructores no se heredan. Cada clase
derivada tendrá sus propios constructores.
• La clase derivada inicializa los atributos propios y si
es necesario inicializar los de la clase padre lo
deberá hacer de manera explícita.
4.2.5 Instrucción super()
Cuando se crea un objeto de una clase derivada se
ejecutan los constructores en este orden:
• Primero se ejecuta el constructor por defecto de
las clases antecesores en orden jerárquico.
• Posteriormente se ejecuta el constructor de la
clase derivada.
4.2.5 Instrucción super()
Cuando se crea un objeto de la clase derivada y se
requiere usar un constructor de la clase padre
distinto al constructor por defecto:
• Se ejecuta la instrucción:
super(param1,param2,…)
• En la clase base debe existir un constructor
adecuado a los parámetros indicados
4.2.5 Instrucción super()
• Una clase derivada puede volver a declarar un
atributo de la clase base.
• En este caso el atributo de la clase base queda
oculto para la clase derivada.
• Para acceder a un atributo de la clase base que ha
quedado oculto en la clase derivada se escribe:
super.nombreAtributo;
4.2.6 Modificador “final”
• En el contexto de herencia, la palabra reservada
final se emplea para proteger la redefinición de los
métodos de una clase.
• Un método o un atributo con este modificador, no
puede ser sobreescrito (override) en las clases
derivadas.
4.2.6 Modificador “final”
• Se puede declarar una clase como final, cuando se
desea garantizar que no se puedan crear clases
derivadas de dicha clase
• Una clase final no se puede heredar
• Uno de los mecanismos que tienen los hackers para
dañar o para obtener información privada en los
sistemas es la de crear una clase derivada y
sustituir dicha clase por la original
4.2.6 Modificador “final”
• Por ejemplo, la clase String que es una de las más
importantes en la programación en lenguaje Java,
está declarada como final.
4.3 Modificadores de
acceso
4.3 Modificadores de Acceso
• El es principal mecanismo de los lenguajes
orientados a objetos para establecer la
encapsulación.
• También conocidos como, modificadores de
visibilidad, permiten establecer el alcance de los
atributos y de los métodos de una clase.
4.3 Modificadores de Acceso
• Para implementar el concepto de encapsulación
mediante los modificadores de acceso, se combina
el uso de paquetes y el uso de herencia y el alcance
propio de las clases.
4.3 Modificadores de Acceso
CLASE DERIVADA EL RESTO DE
MODIFICADOR PACKAGE
PROPIA OTRO PACKAGE LAS CLASES
public ✓ ✓ ✓ ✓
protected ✓ ✓ ✓
<friendly> ✓ ✓
private ✓
4.4 Polimorfismo
4.4.1 Aspectos básicos de polimorfismo
• Permite a una operación tener el mismo nombre en
clases diferentes y que actúe de modo distinto en
cada una de ellas.
• Los objetos pueden responder de diferente manera
al mismo mensaje
• Cuando diferentes tipos de objetos responden en
forma distinta a la llamada a un mismo método.
4.4.1 Aspectos básicos de polimorfismo
• La programación orientada a objetos permite a
través del polimorfismo, que no necesariamente se
conozca en tiempo de compilación el tipo de dato
de un objeto y que este pueda ser definido de
acuerdo al usuario final o a las necesidades de un
programa
• Para implementar el polimorfismo es necesario
hacerlo a través de la herencia.
4.4.2 La clase Object
• Es el ancestro de todas las otras clases, es la raíz de
la jerarquía de herencia
• Siempre que se crea un nuevo tipo de dato (clase),
de manera automática “hereda” los métods de la
clase “Object”.
4.4.2 La clase Object
4.4.3 Implementación de polimorfismo
• Los métodos heredados de la clase base se pueden
redefinir (modificar, sobrescribir) en las clases
derivadas.
• El método en la clase derivada se debe especificar
con el mismo nombre, el mismo número y tipo de
parámetros y el mismo tipo de retorno que en la
clase base.
4.4.3 Implementación de polimorfismo
Persona persona1 = new Persona();
Persona persona2 = new Empleado();
Persona persona3 = new Estudiante();
Estudiante est1 = new Persona();
Empleado emp1 = new Persona();
4.4.3 Implementación de polimorfismo
Persona persona1 = new Persona();
Empleado empleado1 = new Empleado();
Estudiante estudiante1 = new Estudiante();
persona1.Saludar();
empleado1.Saludar();
estudiante1.Saludar();
4.4.3 Implementación de polimorfismo
Persona persona1 = new Persona();
Persona persona2 = new Empleado();
Persona persona3 = new Estudiante();
persona1.Saludar();
persona2.Saludar();
persona3.Saludar();
4.4.3 Implementación de polimorfismo
Ejemplo
Persona persona3 = new Estudiante();
persona3.Saludar();
Empleado empleado1 = new Empleado();
persona3 = empleado1;
persona3.Saludar();
4.4.3 Implementación de polimorfismo
• Ejemplo
Empleado empleado1 = new Empleado();
Estudiante estudiante1 = new Estudiante();
Persona persona4;
persona4 = estudiante1;
persona4.Saludar();
persona4 = empleado1;
persona4.Saludar();
4.4.4 Casting (conversión) de objetos
El polimorfismo permite la “conversión” de un tipo
de dato de un objeto en otro.
Específicamente lo que se actualiza es la referencia
del objeto correspondiente.
Estudiante e1 = new Estudiante();
Persona p1 = e1;
Estudiante e2 = (Estudiante)p1
4.4.4 Casting (conversión) de objetos
Persona persona5 = new Estudiante();
persona5.Apellido= “Ramirez";
Estudiante estudiante2 = (Estudiante)persona5;
estudiante2.Saludar();
System.out.println(" dice "+estudiante2.Apellido);
4.5 Clases
Abstractas
4.5 Clases abstractas
• Una clase abstracta... es una clase genérica que
tiene el propósito de hacer una generalización de
elementos.
• Se denomina abstracta porque es una clase de la
cual no se crean instancias. (no se puede instanciar)
4.5 Clases abstractas
• Se usa únicamente para definir subclases (para
especializar).
• Una clase abstracta puede contener métodos
abstractos y no abstractos
• Para declarar una clase o un método como
abstractos, se utiliza la palabra reservada abstract.
4.5 Clases abstractas
• Con las clases abstractas se pretende definir un
proceso general que luego será implementado por
las sub-clases que hereden de ella.
• Si se tiene una clase que hereda de una Abstracta,
es obligatorio definir los métodos abstractos de la
clase padre.
4.5 Clases abstractas
• Las clases clases abstractas no pueden tener los
modificadores “private” o “final”.
• Una clase abstracta puede heredar de otra clase
abstracta.
• Un método abstracto solo se puede declarar en
clases abstractas.
4.5 Clases abstractas
Consideraciones
• No existen los constructores abstractos
• No existen los métodos estáticos abstractos
• Las clases abstractas no se pueden instanciar.
• Los métodos de una clase abstracta deben ser
públicos
4.5.1 Uso de clases abstractas
public abstract class Figura {
private String color;
public Figura(String color){
this.color = color;
}
public abstract double calcularArea();
public abstract int calcularPerimetro();
public String getColor() {
return color;
}
}
4.5.1 Uso de clases abstractas
public class Cuadrado extends Figura {
private double lado;
public Cuadrado(String color, double lado) {
super(color);
this.lado = lado;
}
public double calcularArea() {
return lado * lado;
}
public int calcularPerimetro(){
return lado*4;
}
}
4.5.2 Clases con modificador final
public abstract class Perro extends Animal
{
// Definición de la clase
}
public final class Gato extends Animal{
// Definición de la clase
}
4.6 Interfaces
4.6.1 Definición de interfaces
• “An interface is an abstract data type that defines a
list of abstract public methods that any class
implementing the interface must provide.”
• Un interfaz en Java es un ente (unidad, elemento,
tad) que contiene un conjunto de métodos
abstractos.
4.6 Interfaces
• El uso de las interfaces es esencial para la
construcción de grandes proyectos de
programación.
• Se utilizan comúnmente en elementos gráficos.
• Una de las formas en las que se puede entender la
idea de uso de interfaces es como un contrato
entre el diseñador de un programa y los
implementadores del programa.
4.6.1 Definición de interfaces
• Es la extensión del concepto de clase abstracta, la
diferencia es que todos sus métodos deberán
declararse obligatoriamente como abstractos.
• Las clases implementan las interfaces. Esto implica
que las clases definen los métodos que se
encuentran declarados en las interfaces.
4.6.2 Uso de interfaces
public interface SerVivo {
void comer();
void caminar();
void dormir(int horas);
int tiempoDeVida();
}
4.6.2 Uso de interfaces
• Una clase invoca una interfaz usando la palabra
“implements” en la definición de la clase.
public class Perro extends Animal implements SerVivo{
// Definición de la clase
}
4.6.2 Uso de interfaces
public abstract interface puedeVolar {
public abstract void Volar(int vel);
void despegar();
double aterrizar();
}
4.6.1 Definición de interfaces
• Una clase solo puede heredar de una clase padre,
pero puede implementar todas las interfaces que
necesite para cumplir las funcionalidades de un
programa
• El uso de interfaces no implica herencia porque no
se reutiliza código ni se conservan características
particulares (atributos)
4.6.2 Uso de interfaces
• Reglas de uso de las interfaces:
1.- No se pueden instanciar.
2.- No requiere tener métodos pero todos los que
tenga deben ser abstractos y publicos
3.- No puede tener el modificador “final”
4.- Una clase puede implementar todas las interfaces
que necesite