Está en la página 1de 72

Herencia y

Polimorfismo
Programación
Orientada a
Objetos
Dra. Rocío Aldeco
Tipo especial de relación entre clases.

Es uno de los aspectos que distinguen el


Herencia Paradigma de Orientación a Objetos frente
a otros paradigmas.

Mecanismo que, bien utilizado, facilita el


mantenimiento y reutilización de los
diseños y el código.
La herencia consigue clasificar los tipos de datos
(abstracciones) por variedad, acercando un poco más el
mundo de la programación al modo de razonar humano.

Este modo de razonar humano se denomina


generalización.

Herencia
Genera jerarquías de generalización/especialización.

La implementación de estas jerarquías en un lenguaje de


programación da lugar a jerarquías de herencia.
¿En qué consiste?
• En la clase hija se definen las
diferencias respecto de la clase padre
Herencia ¿Para qué se usa?
• Para extender la funcionalidad de la
clase padre (generalización)
• Para especializar el comportamiento
de la clase hijo (especialización)
Existen dos clases, a las que llamaremos padre
(superclase o clase base) e hija (subclase o clase
derivada)

Al igual que las herencias en la vida real, la clase


Herencia hija adquiere lo que tiene la clase padre:

• Atributos
• Métodos

Un objeto de la clase hija es también un objeto de


la clase padre
La herencia modifica el mecanismo de paso de
mensajes

Cuando a un objeto de una clase C se le pasa un


mensaje M, se busca un método M en la clase C:
• Si existe un método M en la clase C, se ejecuta ese método y
Herencia termina el proceso
• Si en la clase C no hay ningún método M, se busca éste en la
superclase de C
• Si en la superclase de C existe un método M, se ejecuta ese
método y termina el proceso
• Si en la superclase de C no hay ningún método M, se busca en las
superclases de la superclase hasta que se encuentra y se ejecuta.
• Si no se encuentra en ninguna de las superclases, de forma que el
objeto no entiende ese mensaje M, resultaré en un error
– La clase A se debe relacionar mediante herencia con la
clase B si “A ES-UN B”.
– Si la relación tiene sentido, entonces la situación de
herencia es la más probable para ese caso
HERENCIA – Un pájaro es un ave

“ES-UN” – Un gato es un mamífero


– Un pastel de manzana es un pastel
– Una matriz de enteros es un matriz
– Un coche es un vehículo
Herencia La herencia como reutilización de código: Una
de clase derivada puede heredar comportamiento
de una clase base, por tanto, el código no
implemen necesita volver a ser escrito para la derivada.
tación

Tipos de
Herencia Herencia La herencia como reutilización de conceptos: Esto
de ocurre cuando una clase derivada sobrescribe el
interfaz comportamiento definido por la clase base.
Aunque no se comparte ese código entre ambas
clases, ambas comparten el prototipo del
método (comparten el concepto).
– Simple: Una clase base – Multinivel: clase base e
o padre. intermediaria.

Clase base
Clase base

Tipos de
Herencia Clase
Clase derivada intermediaria

Clase derivada
● Jerárquica: única – Múltiple: Más de una clase
clase base. base

Tipos de
Herencia
– Como se modelaría una
aplicación que reciba los
Ejemplo parámetros de las diferentes
figuras en 2D. Esto usando el
concepto de herencia.
– Ventajas
– Se ahorra código
– Permite reutilizar código
extendiendo su funcionalidad
– Compartición de código
Herencia – Consistencia de interfaces
– Construcción de componentes

– Prototipado rápido
– Polimorfismo
– Ocultación de información
– Desventajas
– Se ahorra código
– Se introduce una fuerte dependencia en
la clase hija respecto a la clase padre
– Puede dificultar la reutilización
– Un cambio en la clase padre puede tener
efectos imprevistos en las clases hijas
Herencia – Un objeto de una clase hija puede tener
un comportamiento inconsistente con lo
esperado de un objeto de la clase padre
– Se establece una jerarquía que si se
cambia el criterio de clasificación puede
acarrear muchas modificaciones
– Velocidad de ejecución debido a la
sobrecarga de paso de mensajes
– Complejidad del programa
– Se indica usando la palabra reservada extends
class Punto3D extends Punto2D
– Visibilidad:
– Los miembros privados de la superclase no son visibles
desde la subclase
– Los miembros públicos de la superclase son visibles y Herencia en
siguen siendo públicos en la subclase
Java
– Se puede acceder a los miembros de la superclase usando la
palabra reservada super
– Si una clase se declara como final no se puede heredar de
ella
– En java, todas las clases heredan implícitamente de la clase
Object.
Ejemplo - Herencia en Java

class Punto2D { final class Punto3D extends


Punto2D {
private int x,y;
private int z;
Punto2D (int x, int y) Punto3D (int x, int y, int z) {
{ super (x,y);
this.x=x; this.y=y; this.z=z;
} }
public void pintar() {
public void pintar () {
super.pintar();
… …
} }
} }
– La sobrecarga o overload se logra al nombrar
igual a un método pero con mayor número de
parámetros (o argumentos)

public class Asalariado extends Empleado


{
Sobrecarga private double salarioMensual;

void public calculaPago(int dinero) {}

void public calculaPago(int periodos,int


numeroPagos)
{}
//más métodos para esta clase.
}
– Cuando creas los constructores de las subclases,
la primera línea debe ser una llamada al
constructor de la clase base (superclase) usando
la palabra reservada super().

public class Asalariado extends Empleado {


Ejemplo - private doble salarioMensual;
Constructores public Asalariado() {
super();
//constructor de la clase base
salarioMensual=0;
}
}
public class Asalariado extends Empleado {
private doble salarioMensual;
public Asalariado() { //constructor
super(n,d,t,e);
Ejemplo - // constructor con parámetros de la clase base
Constructores valor
// (Empleado).Los parámetros ya deben tener un

salarioMensual=0;
}
}
– La sobreescritura de métodos (o override) nos permite
redefinir un método que heredamos para que este
funcione de acuerdo a las necesidades de una clase hija
y no a lo definido por la clase padre.

Sobreescritura – Las subclases pueden tener sus propios métodos, si la


subclase tiene un método con el mismo nombre que la
clase base (en este caso Empleado), cuando se llama a
ese método, se usará el método de la subclase. Con lo
que el método se adapta a las necesidades de la
subclase.
public class Empleado{
//atributos
public String toString() {
return “Nombre “+nombre”\nDireccion ”+direccion+ ….);
}
}

public class Asalariado extends Empleado{


Sobreescritura //atributos
public String toString() { //mismo nombre
return super.toString()+”\n Salario“+salarioMensual;
}
}
Asalariado s3=new Asalariado();
s3.toString(); //Usará la definición del método en la
//subclase Asalariado y no el de la
clase // base Empleado
– Para usar el método en la clase base puedes usar:
super.toString();
– Con super.* puedes tener acceso a los miembros
(métodos, atributos, etc.) de la clase sólo si no son
Sobreescritura privados.
– Si no quieres que otras subclases redefinan un método
debes emplear la palabra final:
final public void algunMetodo() {}
En ciertos casos, una clase se diseña directamente
para ser extendida por un conjunto de subclases.

En estos casos suele interesar no implementar


alguno de sus métodos, pues no tiene ningún
Clases significado en la clase base.
Abstractas Es necesario declarar tanto la clase como los
métodos no implementados como abstractos a
través de la palabra reservada abstract
Una clase abstracta es aquella que tiene alguno de
sus métodos definido pero no implementado.
● Podemos crear una clase Animal a partir de la cual crearemos
otras clases que definan animales concretos.
● (Casi) todos los animales emiten algún sonido, pero no hay
ninguno común para todos los animales.
● Cada subclase reimplementará el método sound() como le
Ejemplo - convenga.
Clases public abstract class Animal {
Abstractas private String nombre;
public abstract void sound();
public Animal (String nombre){
this.nombre= new String(nombre);
}
...
}
A veces nos interesa que todos los métodos de una clase
abstracta sean abstractos.
• Lo usamos para obligar a que todas las subclases reimplementen esos
métodos.

Para estos casos, Java proporciona unas clases especiales


llamadas interfaces.
Interfaces
Se declaran como interface, no como class.

Representan el concepto de clase abstracta pura.

Una clase declarada como interfaz no puede tener ningún


método implementado.
– Para heredar (o implementar) de una interfaz se usa la
palabra reservada implements
public class MiClase implements Serializable
Una interfaz puede heredar de otra interfaz.
Herencia de –

– Una clase (abstracta o no) puede heredar de una


Interfaz interfaz.
– Una interfaz NO puede heredar de una clase.
– Es un mecanismo muy usado en Java.
Sólo se puede hacer herencia de
implementación (extends) de una
clase.
Un poco más • No se crean problemas de referencias
sobre circulares o alternativas a un método con la
herencia... misma declaración

Se puede hacer herencia de interfaz


(implements) de todas las
interfaces que se quiera
– Un interfaz es una lista de acciones que puede llevar a
cabo un determinado objeto.
– En una clase además de aparecer los métodos aparecía
el código para dichos métodos, en cambio en un interfaz
sólo existe el prototipo de una función, no su código.
– En java una interfaz define la lista de métodos, pero para
que una clase posea una interfaz hay que indicar
explícitamente que lo implementa mediante la claúsula
implements.
Interfaces
[modif.visibilidad] interface nombreInterfaz [extends
listaInterfaces]
{
prototipo método1;
..

prototipo método1;
}
Ejemplo - Interfaces
Ejemplo - Interfaces
Polimorfismo
Polimorfismo es una palabra de origen griego
que significa "muchas formas".

Este termino se utiliza en la POO para


referirse a la “propiedad por la que es posible Polimorfismo
enviar mensajes sintácticamente iguales a
objetos de tipos distintos”.
Gracias a la herencia, se puede interpretar
que un objeto de una subclase es también un
objeto de una superclase.
– Es un mecanismo que se aprovecha de la herencia
(especialmente de interfaz) para manejar
indistintamente objetos de las subclases como si
fuesen objetos de la clase base, sin preocuparse por la
clase en concreto a la que pertenecen.
– Se utiliza cuando un método (comportamiento) varía
en función del tipo de un atributo (parámetro).
Polimorfismo – Se declaran atributos, parámetros o variables de la
clase base y se les asignan objetos de alguna de las
subclases.
– Debemos estar seguros de que se pueden usar todos
los métodos declarados en la clase base (acceso).
– Si necesitamos usar métodos de las subclases es
necesario hacer un cast.
– La utilización del cast aumenta la posibilidad de
hacer conversiones erróneas, por lo que es mejor
evitarlo (buenas practicas).
– A veces es necesario preguntar por la clase a la que
pertenece un objeto:
Polimorfismo – instanceof
– objeto.getClass().getName()
– En general, preguntar por la clase de un objeto
implica un diseño malo y problemas para modificar
el diseño y el código.
Ejemplo - Polimorfismo
Paquetes
Un Paquete en Java es un
contenedor de clases que permite
agrupar las distintas partes de un
programa.
Paquetes
Tiene una funcionalidad y comparte
elementos comunes, definiendo la
ubicación de dichas clases en un
directorio de estructura jerárquica.
– Agrupamiento de clases con
características comunes.
– Reutilización de código al promover
principios de programación orientada a
objetos como la encapsulación y
modularidad.
– Mayor seguridad al existir niveles de
Ventajas acceso.
– Evita la colisión de clases que tengan el
mismo nombre.
– Mantenibilidad de código ya que si un
paquete se enfoca en la agrupación de
clases con características comunes, el
cambio en la funcionalidad se limita a las
clases contenidas en dicho paquete.
– Un paquete puede contener:
– Clases
Contenido – Interfaces

– Tipos Enumerados

– Anotaciones
Un paquete Java tiene los siguientes atributos:

Son opcionales. Si no se define un paquete para un fichero de código Java se


definirá un paquete llamado default automáticamente.

Es definido un paquete por cada archivo de código Java.

Atributos Los nombres de paquete que comienzan con el nombre java.* y javax.* son
reservados.

El nombre del paquete equivale a una estructura de archivos. El nombre de


paquete com.dominio_empresa.utilidades debería ser igual al directorio
[ruta_directorio]\com\dominio_empresa\utilidades.
Si una clase incluida en un paquete no se relaciona con su respectiva estructura
de directorio, la clase no podrá usarse.
– El nombre del paquete se define de manera
inversa al dominio de la organización o grupo. Por
ejemplo, dominioempresa.com puede ser usado
como nombre de paquete así:

com.dominio_empresa.utilidades Convenciones

– El nombre del paquete debería definirse en


minúscula. Si existen varias palabras en el
nombre, se pueden separar con guión bajo.
¿Cómo crear – Para declarar un paquete en Java se hace uso
de la palabra reservada package seguido de la
paquetes en ruta del paquete.
Java? package ruta.del.paquete;
Si un miembro de una clase no tiene un modificador de
acceso explícito, entonces es visible dentro de su
paquete pero no fuera de su paquete (default).

Los miembros explícitamente declarados públicos


(public) se puede acceder desde diferentes clases y
diferentes paquetes.
Control de
Acceso Un miembro privado (private) es accesible solo para
los otros miembros de su clase. Un miembro privado no
se ve afectado por su membresía en un paquete.

Se puede acceder a un miembro especificado como


protegido (protected) dentro de su paquete y a
subclases en otros paquetes.
Control de Acceso
– La declaración import permite usar
uno o más miembros de un
paquete.
Importar – Esto le permite usar esos

paquetes miembros directamente, sin la


calificación explícita del paquete.

import paquete.nombredeclase;
– Un ejemplo del uso de paquetes el la biblioteca de clases de
Importar paquetes Java
– El paquete en Java se declara primero:
La declaración del paquete debe estar al
principio del archivo Java, es decir, es la
primera línea que se debe ver en nuestro
Recomendaciones código o archivo .java. Primero se
declara el paquete, y luego podremos
poner los imports y luego las clases,
interfaces, métodos, etc.
– Cada punto en la ruta del paquete es
una nueva carpeta: Cuando se escribe
la ruta del paquete en Java, se pueden
especificar una ruta compleja usando el
punto .
– Buenas prácticas para nombrar paquetes en
Java: Los paquetes en java se declaran siempre
en minúsculas y en caso de ser necesario las
Recomendaciones palabras se separan usando un guión bajo _
– Si no se declara un paquete (paquete por
defecto): Si decidimos no declarar un paquete
para nuestra clase, ésta quedará en un paquete
que se conoce como paquete por defecto
(default package).
– En este paquete estarán todas las clases que no
tengan un paquete declarado.
– Siempre es recomendable declarar un paquete a
cada componente de nuestro programa.
Ejemplo
Ejemplo
Ejemplo
Compilando...
Compilando
Compilando
Compilando
Documentación
https://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javadoc.html
Lectura –
Javadoc es una utilidad de Oracle para la generación de
documentación de APIs en formato HTML a partir de
código fuente Java.

Javadoc es el estándar de la industria para documentar


clases de Java. La mayoría de los IDEs los generan
automáticamente.
JavaDoc
Javadoc también proporciona una API para crear doclets y
taglets, que le permite analizar la estructura de una
aplicación Java.

https://docs.oracle.com/javase/1.5.0/doc
s/tooldocs/windows/javadoc.html
– Java The Complete Reference Ninth Edition, Oracle Press.
– ¿Cómo programar en Java?. Deitel y Deitel, 7ª edición, Pearson,
Prentice Hall.
Referencias – Object-Oriented Thought Process, The (Developer's Library), Matt
Weisfeld, 5th Edition.

También podría gustarte