Herencia y polimorfismo
ALGORITMOS Y ESTRUCTURAS DE DATOS II - CAECE
Herencia
• Crea una nueva clase a partir de otra, incluyendo
nuevas capacidades
• La subclase es mas específica y representa a un
grupo mas especializado de objetos
• Herencia = especialización
• Definen una relación “es un”
Ejemplos de herencia
Superclase Subclases
Estudiante EstudianteGraduado, EstudianteNoGraduado
Figura Circulo, Triangulo, Rectangulo, Esfera, Cubo
Prestamo PrestamoAutomovil, PrestamoProcrear,
PrestamoUVA
Empleado Docente, Administrativo
CuentaBancaria CuentaDeCheques, CuentaDeAhorros
Superclase
Jerarquía
Sintaxis de la Herencia
• Para heredar de una clase utilizamos la palabra reservada
extends con el nombre de la clase que vamos a heredar:
Inicialización de clase base
• Al crear un objeto de una subclase, de alguna forma estamos
creando un “subobjeto” de la superclase que estamos
heredando
• Tenemos que inicializar correctamente este “subobjeto”
invocando al constructor de la superclase
• Java lo hace por default, pero podemos modificar el
comportamiento
• Se construye de lo general (superclase) a lo particular
(subclase)
* Ver ejemplo herencia
Constructores de clase base
• Podemos invocar constructores que no sean el constructor
default en caso de que necesitemos cambiar el
comportamiento
• Lo hacemos con la palabra reservada super y la lista de
argumentos que queremos enviar
• ¡Cuidado! Tenemos que tener definido el constructor para
esos argumentos en la superclase
* Ver ejemplo herencia
Sobrecarga y sobreescritura de métodos
• Ya vimos que podemos “sobrecargar” un método
llamándolo del mismo nombre que otro, pero recibiendo
una lista distinta de parámetros
• En Java sobrecargar métodos en subclases no interfiere con
los métodos de las superclases
• Definiendo un método con la misma firma y agregando el
calificado @Override estamos sobreescribiendo el método
* Ver ejemplo sobrecarga
Sobrecarga y sobreescritura para
consturctores
• Únicamente podemos sobrecargar un constructor, no
podemos sobreescribirlo
• El constructor no se hereda
• Lo que podemos hacer desde la subclase es invocar
distintos constructores en caso de que estén sobrecargados
El calificador protected
• Permite ocultar información para todos, excepto a quienes
hereden la clase en cuestión.
• Podemos crear atributos y métodos con el calificador
protected
• Pero no es recomendable crear atributos, si no crear
getters y setters que sean protected para quedarnos con la
potestad de poder cambiar la implementación
Palabras clave this y super
• this → Lo usamos para acceder a los atributos o métodos
del objeto instanciado sobre el que estamos operando
• super → Lo usamos para acceder a los métodos de la
superclase si es que los sobreescribimos en la subclase
• Podríamos acceder a los atributos de la superclase, pero es
una buena práctica acceder por getters y setters
* Ver ejemplo toString() Alumno
Componente final
• El significado puede diferir según el contexto, pero en
general significa “Este elemento no puede modificarse”
• Motivos para no permitir cambios en elementos: diseño y
eficiencia
• Podemos utilizarlo en: atributos, métodos y clases
Atributos final
• Definen una constante
• Constantes definidas en tiempo de compilación
oPermite adelantar cálculos en tiempo de compilación
oDeben ser tipos primitivos, se definen en la cláusula final al principio
y hay que inicializarlas con un valor
•Inicializaciones en tiempo de ejecución que queremos que no cambien
oSucede cuando utilizamos el calificador final con referencias de
objetos
o¡Cuidado! Cuando utilizamos final en una referencia a un objeto, no
hacemos que el objeto sea constante, si no que la referencia es la
que va a ser constante
Atributos final
• Podemos definir atributos final en blanco siempre que los
inicialicemos antes de utilizarlos
• Esto nos proporciona flexibilidad porque cada objeto
instanciado puede tener un valor distinto y “constante”
• Podemos también declarar argumentos final escribiendo el
calificador en la lista de argumentos, esto valida que dentro
del método no se modifique el valor al que apunta la
referencia
Métodos final
• Podemos “bloquear” un método si lo definimos como final
para evitar que subclases modifiquen su significado
• Los métodos private son implícitamente de tipo final, dado
que no se pueden acceder desde la subclase, tampoco van a
poder ser reemplazados
Clases final
• Cuando definimos una clase como final lo que estamos
queriendo decir es que esa clase no puede ser heredada
• Sus campos no necesariamente tienen que ser final
• Sus métodos son implícitamente final porque al no admitir
herencia, no se pueden modificar
Clases y métodos abstractos
• Se trata de clases que tienen algunos métodos no
implementados
• Se declaran con la palabra clave abstract y solo se
especifica el retorno y la firma del método, la
implementación será una responsabilidad de las subclases
que la hereden
• Si tenemos un método abstract, toda la clase tiene que
estar calificada como abstract
Clases y métodos abstractos
• Las clases abstractas no se pueden instanciar
• Para instanciar una clase abstracta tenemos que
crear una subclase que herede de la abstracta e
implemente todos los métodos abstractos
• Podemos definir una clase completa como abstract
sin que tenga ningún método abstracto, si no porque
no queremos que esa clase sea instanciada
Clases internas anónimas
• Son clases que se definen dentro de otras clases y
no tienen nombre
• Se definen y se crean en la misma sentencia
• No tienen constructores, solo bloques estáticos
Declaración de clases internas anónimas
• new { //Definición de la clase anónima };
• new ClaseQueHereda () { //Definición de clase
anónima };
• new InterfazQueImplementa () { //Definición de
clase anónima };
Usos de clases anónimas
• Se utilizan mas que nada en listeners, callbacks o
eventos
• Permiten una especie de herencia múltiple
• Permiten declarar atributos no estáticos y no finales
Sobreescritura de métodos conocidos
• Método toString()
• Permite que asociemos un objeto a un texto representativo según
criterios que definimos en la sobreescritura
• Método equals()
• Permite que podamos comparar objetos para determinar si son
iguales según criterios que definimos en la sobreescritura
• Método compareTo()
• Permite que podamos comparar objetos para determinar si un objeto
es mayor/igual/menor que otro objeto según criterios que
definimos en la sobreescritura
* Ver ejemplo ej protected
Polimorfismo
• Permite programar en forma general en vez de en forma
específica
• Permite tratar a los objetos de varias subclases como si
fueran objetos de la superclase
• Es efectivo para implementar sistemas de software en
capas
Se utilizan clases abstractas
¿Cómo se Los atributos, métodos e incluso las clases pueden
implementa el ser abstractos Itálica
polimorfismo?
Se utilizan clases
abstractas
Los atributos,
métodos e incluso las
clases pueden ser
abstractos
* Ver ejemplo polimorfismo
y clases abstractas
ALGORITMOS Y ESTRUCTURAS DE DATOS II - CAECE