SlideShare ist ein Scribd-Unternehmen logo
1 von 8
Downloaden Sie, um offline zu lesen
1
Programación Orientada a
Objetos en Java
Gonzalo Méndez Pozo
Dpto. de Ingeniería de Software e Inteligencia Artificial
Universidad Complutense de Madrid
Curso 2006 - 2007
Tema 4 – Herencia y
Polimorfismo
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Herencia
Tipo especial de relación entre clases
Es uno de los aspectos que distinguen el
Paradigma de Orientación a Objetos
frente a otros paradigmas
Mecanismo que, bien utilizado, facilita la
modificabilidad y reutilización de los
diseños y el código
2
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Herencia
¿En qué consiste?
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
hija pasa a tener lo que tiene la clase padre
Atributos
Métodos
Un objeto de la clase hija es también un objeto de
la clase padre
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Herencia
¿En qué consiste?
En la clase hija se definen las diferencias
respecto de la clase padre
¿Para qué se usa?
Para extender la funcionalidad de la clase
padre
Para especializar el comportamiento de la
clase padre
3
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Herencia
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
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 o bien se
encuentra y se ejecuta o no se encuentra en ninguna de las
superclases, de forma que el objeto no entiende ese mensaje
M, dando como resultado el consiguiente error
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Herencia
Ventajas
Se ahorra código
Permite reutilizar código extendiendo su funcionalidad
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
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 o clasificación. Si cambia el criterio
de clasificación puede acarrear muchas modificaciones
4
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Herencia en Java
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 siguen
siendo públicos en la subclase
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.
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Herencia en Java
class Punto2D
{
private int x,y;
Punto2D (int x, int y)
{
this.x=x; this.y=y;
}
public void pintar ()
{
…
}
}
final class Punto3D extends Punto2D
{
private int z;
Punto3D (int x, int y, int z)
{
super (x,y); this.z=z;
}
public void pintar()
{
super.pintar();
…
}
}
5
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Clases Abstractas
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
significado en la clase base.
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, por tanto, aquella que
tiene alguno de sus métodos definido pero no
implementado
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Clases Abstractas
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
convenga
public abstract class Animal
{
private String nombre;
public abstract void sound();
public Animal (String nombre)
{
this.nombre=
new String(nombre);
}
…
}
6
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Interfaces
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
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
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Herencia de Interfaz
Para heredar de una interfaz se usa la palabra
reservada implements
public class MiClase implements Serializable
Reglas:
Una interfaz puede heredar de otra interfaz
Una clase (abstracta o no) puede heredar de una
interfaz
Una interfaz NO puede heredar de una clase
Es un mecanismo muy usado en Java
7
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Más sobre Herencia en Java
Sólo se puede hacer herencia de
implementación (extends) de una clase
No se crean problemas de referencias
circulares o alternativas a un método con la
misma declaración
Se puede hacer herencia de interfaz
(implements) de todas las interfaces que
se quiera
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Polimorfismo
Gracias a la herencia, se puede interpretar que
un objeto de una subclase es también un objeto
de una superclase
El polimorfismo 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
Interesa utilizarlo cuando un comportamiento
varía en función del tipo de algo
8
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Polimorfismo
Se declaran atributos, parámetros o
variables de la clase base
Se les asignan objetos de alguna de las
subclases
Estamos seguros de que se pueden usar
todos los métodos declarados en la clase
base
Si necesitamos usar métodos de las
subclases es necesario hacer un cast
Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial
Polimorfismo
La utilización del cast aumenta la posibilidad de
hacer conversiones erróneas, por lo que es
mejor evitarlo
Se puede preguntar por la clase a la que
pertenece un objeto:
instanceof
objeto.getClass().getName()
Es una mala idea. 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

Weitere ähnliche Inhalte

Was ist angesagt?

Programación Orientada a Objetos - herencia y polimorfismo
Programación Orientada a Objetos - herencia y polimorfismoProgramación Orientada a Objetos - herencia y polimorfismo
Programación Orientada a Objetos - herencia y polimorfismoAlvaro Enrique Ruano
 
Herencia y Polimorfismo
Herencia y PolimorfismoHerencia y Polimorfismo
Herencia y Polimorfismonestor_moren
 
Poo 3 herencia
Poo 3 herenciaPoo 3 herencia
Poo 3 herenciajlmanmons
 
09 Clases Abstractas E Interfaces
09   Clases Abstractas E Interfaces09   Clases Abstractas E Interfaces
09 Clases Abstractas E InterfacesNetwork Sens
 
Curso Java Inicial 4 Poo En Java
Curso Java Inicial   4 Poo En JavaCurso Java Inicial   4 Poo En Java
Curso Java Inicial 4 Poo En JavaEmilio Aviles Avila
 
Clases abstractas e interfaces (AlexandraPerez)
Clases abstractas e interfaces (AlexandraPerez)Clases abstractas e interfaces (AlexandraPerez)
Clases abstractas e interfaces (AlexandraPerez)Alexandra Pérez
 
Clases abstractas e interfaces en java
Clases abstractas e interfaces en java Clases abstractas e interfaces en java
Clases abstractas e interfaces en java Nathy_A
 
Que es una clase en java
Que es una clase en javaQue es una clase en java
Que es una clase en javaAndres Vasquez
 
Clases abstractas e interfaces
Clases abstractas e interfacesClases abstractas e interfaces
Clases abstractas e interfaceslopezcortes
 
Fundamentos de Java
Fundamentos de JavaFundamentos de Java
Fundamentos de Javamartosfre
 
Clases abstractas interfaces
Clases abstractas interfacesClases abstractas interfaces
Clases abstractas interfacesAlexitoPeralta
 

Was ist angesagt? (20)

Programación Orientada a Objetos - herencia y polimorfismo
Programación Orientada a Objetos - herencia y polimorfismoProgramación Orientada a Objetos - herencia y polimorfismo
Programación Orientada a Objetos - herencia y polimorfismo
 
Herencia y Polimorfismo
Herencia y PolimorfismoHerencia y Polimorfismo
Herencia y Polimorfismo
 
Poo en java herencia
Poo en java   herenciaPoo en java   herencia
Poo en java herencia
 
Poo 3 herencia
Poo 3 herenciaPoo 3 herencia
Poo 3 herencia
 
09 Clases Abstractas E Interfaces
09   Clases Abstractas E Interfaces09   Clases Abstractas E Interfaces
09 Clases Abstractas E Interfaces
 
Interfaces en Java
Interfaces en JavaInterfaces en Java
Interfaces en Java
 
Curso Java Inicial 1 POO
Curso Java Inicial   1 POOCurso Java Inicial   1 POO
Curso Java Inicial 1 POO
 
Interfaces
InterfacesInterfaces
Interfaces
 
Curso Java Inicial 4 Poo En Java
Curso Java Inicial   4 Poo En JavaCurso Java Inicial   4 Poo En Java
Curso Java Inicial 4 Poo En Java
 
Clases abstractas e interfaces (AlexandraPerez)
Clases abstractas e interfaces (AlexandraPerez)Clases abstractas e interfaces (AlexandraPerez)
Clases abstractas e interfaces (AlexandraPerez)
 
JAVA- basico
JAVA- basicoJAVA- basico
JAVA- basico
 
Clases abstractas e interfaces en java
Clases abstractas e interfaces en java Clases abstractas e interfaces en java
Clases abstractas e interfaces en java
 
Herencia y polimorfismo
Herencia y polimorfismoHerencia y polimorfismo
Herencia y polimorfismo
 
Clases abstractas e interfaces en java
Clases abstractas e interfaces en javaClases abstractas e interfaces en java
Clases abstractas e interfaces en java
 
Que es una clase en java
Que es una clase en javaQue es una clase en java
Que es una clase en java
 
Clases abstractas e interfaces
Clases abstractas e interfacesClases abstractas e interfaces
Clases abstractas e interfaces
 
Fundamentos de Java
Fundamentos de JavaFundamentos de Java
Fundamentos de Java
 
Herencia poo
Herencia pooHerencia poo
Herencia poo
 
Clases abstractas interfaces
Clases abstractas interfacesClases abstractas interfaces
Clases abstractas interfaces
 
Abstracción
AbstracciónAbstracción
Abstracción
 

Ähnlich wie Tema4 herencia

Programacion Orientada a Objetos IE
Programacion Orientada a Objetos IEProgramacion Orientada a Objetos IE
Programacion Orientada a Objetos IEKaren Olan
 
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...Didier Granados
 
Jyoc java-cap08 principios poo
Jyoc java-cap08 principios pooJyoc java-cap08 principios poo
Jyoc java-cap08 principios pooJyoc X
 
Introduccionjava
IntroduccionjavaIntroduccionjava
IntroduccionjavaOLGA MONTES
 
Porafolio unidad 1
Porafolio unidad 1Porafolio unidad 1
Porafolio unidad 1bchrmz
 
Porafolio unidad 1
Porafolio unidad 1Porafolio unidad 1
Porafolio unidad 1bchrmz
 
Lenguaje de programacion unidad 2 clases y objetos
Lenguaje de programacion unidad 2 clases y objetosLenguaje de programacion unidad 2 clases y objetos
Lenguaje de programacion unidad 2 clases y objetosAndres Herrera Rodriguez
 
Presentacion progra
Presentacion prograPresentacion progra
Presentacion prograzeta2015
 
Programaciom avanzada orientada a objetos
Programaciom avanzada orientada a objetosProgramaciom avanzada orientada a objetos
Programaciom avanzada orientada a objetosJonathan Macías
 
[ES] Programación orientada a objeto con java
[ES] Programación orientada a objeto con java[ES] Programación orientada a objeto con java
[ES] Programación orientada a objeto con javaEudris Cabrera
 
Historia java ruben rodriguez
Historia java ruben rodriguezHistoria java ruben rodriguez
Historia java ruben rodriguezcoruniversitec
 
Trabajo investigativo sobre la programación orientada a objetos y java
Trabajo investigativo sobre la programación orientada a objetos y javaTrabajo investigativo sobre la programación orientada a objetos y java
Trabajo investigativo sobre la programación orientada a objetos y javaJulio César Rojas Maza
 
Conceptos básicos de programación orientada a objetos (poo)
Conceptos básicos de programación orientada a objetos (poo)Conceptos básicos de programación orientada a objetos (poo)
Conceptos básicos de programación orientada a objetos (poo)Maria Garcia
 

Ähnlich wie Tema4 herencia (20)

Tema7 herencia
Tema7 herenciaTema7 herencia
Tema7 herencia
 
Programacion Orientada a Objetos IE
Programacion Orientada a Objetos IEProgramacion Orientada a Objetos IE
Programacion Orientada a Objetos IE
 
Guía Herencia PO_O
Guía Herencia PO_OGuía Herencia PO_O
Guía Herencia PO_O
 
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
Desarrollo de Aplicaciones Web II - Sesión 05 - Evolución de los lenguajes PO...
 
Jyoc java-cap08 principios poo
Jyoc java-cap08 principios pooJyoc java-cap08 principios poo
Jyoc java-cap08 principios poo
 
Act10byme
Act10bymeAct10byme
Act10byme
 
Introduccionjava
IntroduccionjavaIntroduccionjava
Introduccionjava
 
Porafolio unidad 1
Porafolio unidad 1Porafolio unidad 1
Porafolio unidad 1
 
Porafolio unidad 1
Porafolio unidad 1Porafolio unidad 1
Porafolio unidad 1
 
Lenguaje de programacion unidad 2 clases y objetos
Lenguaje de programacion unidad 2 clases y objetosLenguaje de programacion unidad 2 clases y objetos
Lenguaje de programacion unidad 2 clases y objetos
 
Presentacion progra
Presentacion prograPresentacion progra
Presentacion progra
 
Programaciom avanzada orientada a objetos
Programaciom avanzada orientada a objetosProgramaciom avanzada orientada a objetos
Programaciom avanzada orientada a objetos
 
Interfaces 14k
Interfaces 14kInterfaces 14k
Interfaces 14k
 
Unidad 1_Programacion Orientada a Objetos
Unidad 1_Programacion Orientada a ObjetosUnidad 1_Programacion Orientada a Objetos
Unidad 1_Programacion Orientada a Objetos
 
[ES] Programación orientada a objeto con java
[ES] Programación orientada a objeto con java[ES] Programación orientada a objeto con java
[ES] Programación orientada a objeto con java
 
Historia java ruben
Historia java rubenHistoria java ruben
Historia java ruben
 
Historia java ruben rodriguez
Historia java ruben rodriguezHistoria java ruben rodriguez
Historia java ruben rodriguez
 
JAVA 00 - TEMA 05 - HERENCIA
JAVA 00 - TEMA 05 - HERENCIAJAVA 00 - TEMA 05 - HERENCIA
JAVA 00 - TEMA 05 - HERENCIA
 
Trabajo investigativo sobre la programación orientada a objetos y java
Trabajo investigativo sobre la programación orientada a objetos y javaTrabajo investigativo sobre la programación orientada a objetos y java
Trabajo investigativo sobre la programación orientada a objetos y java
 
Conceptos básicos de programación orientada a objetos (poo)
Conceptos básicos de programación orientada a objetos (poo)Conceptos básicos de programación orientada a objetos (poo)
Conceptos básicos de programación orientada a objetos (poo)
 

Mehr von Robert Wolf

Tema 16 acceso a base de datos usando jpa por gio
Tema 16   acceso a base de datos usando jpa por gioTema 16   acceso a base de datos usando jpa por gio
Tema 16 acceso a base de datos usando jpa por gioRobert Wolf
 
Tema 15 aplicaciones de dos capas por gio
Tema 15   aplicaciones de dos capas por gioTema 15   aplicaciones de dos capas por gio
Tema 15 aplicaciones de dos capas por gioRobert Wolf
 
Tema 14 imágenes en java por gio
Tema 14   imágenes en java por gioTema 14   imágenes en java por gio
Tema 14 imágenes en java por gioRobert Wolf
 
Tema 13 gráficas en java por gio
Tema 13   gráficas en java por gioTema 13   gráficas en java por gio
Tema 13 gráficas en java por gioRobert Wolf
 
Tema 12 hilos en java por gio
Tema 12   hilos en java por gioTema 12   hilos en java por gio
Tema 12 hilos en java por gioRobert Wolf
 
Tema 11 expresiones regulares en java por gio
Tema 11   expresiones regulares en java por gioTema 11   expresiones regulares en java por gio
Tema 11 expresiones regulares en java por gioRobert Wolf
 
Tema 10 clase abstractas e interfaz
Tema 10 clase abstractas e interfazTema 10 clase abstractas e interfaz
Tema 10 clase abstractas e interfazRobert Wolf
 
Tema 10 entrada y salida por gio
Tema 10   entrada y salida por gioTema 10   entrada y salida por gio
Tema 10 entrada y salida por gioRobert Wolf
 
Tema 9 pruebas unitarias por gio
Tema 9   pruebas unitarias por gioTema 9   pruebas unitarias por gio
Tema 9 pruebas unitarias por gioRobert Wolf
 
Tema 9 aplicaciones de dos capas por gio
Tema 9   aplicaciones de dos capas por gioTema 9   aplicaciones de dos capas por gio
Tema 9 aplicaciones de dos capas por gioRobert Wolf
 
Tema 8 entrada y salida por gio
Tema 8   entrada y salida por gioTema 8   entrada y salida por gio
Tema 8 entrada y salida por gioRobert Wolf
 
Tema 8 desarrollo de aplicaciones en java por gio
Tema 8   desarrollo de aplicaciones en java por gioTema 8   desarrollo de aplicaciones en java por gio
Tema 8 desarrollo de aplicaciones en java por gioRobert Wolf
 
Tema 7 gui, swing y java beans por gio
Tema 7   gui, swing y java beans por gioTema 7   gui, swing y java beans por gio
Tema 7 gui, swing y java beans por gioRobert Wolf
 
Tema 7 desarrollo de aplicaciones en java - lsia por gio
Tema 7   desarrollo de aplicaciones en java - lsia por gioTema 7   desarrollo de aplicaciones en java - lsia por gio
Tema 7 desarrollo de aplicaciones en java - lsia por gioRobert Wolf
 
Tema 6 gui, swing y java beans por gio
Tema 6   gui, swing y java beans por gioTema 6   gui, swing y java beans por gio
Tema 6 gui, swing y java beans por gioRobert Wolf
 
Tema 6 colecciones por gio
Tema 6   colecciones por gioTema 6   colecciones por gio
Tema 6 colecciones por gioRobert Wolf
 
Tema 5 arreglos y cadenas por gio
Tema 5   arreglos y cadenas por gioTema 5   arreglos y cadenas por gio
Tema 5 arreglos y cadenas por gioRobert Wolf
 
Tema 5 arreglos y cadenas - lsia por gio
Tema 5   arreglos y cadenas - lsia por gioTema 5   arreglos y cadenas - lsia por gio
Tema 5 arreglos y cadenas - lsia por gioRobert Wolf
 

Mehr von Robert Wolf (20)

Tema6resumido
Tema6resumidoTema6resumido
Tema6resumido
 
Tema 6
Tema 6Tema 6
Tema 6
 
Tema 16 acceso a base de datos usando jpa por gio
Tema 16   acceso a base de datos usando jpa por gioTema 16   acceso a base de datos usando jpa por gio
Tema 16 acceso a base de datos usando jpa por gio
 
Tema 15 aplicaciones de dos capas por gio
Tema 15   aplicaciones de dos capas por gioTema 15   aplicaciones de dos capas por gio
Tema 15 aplicaciones de dos capas por gio
 
Tema 14 imágenes en java por gio
Tema 14   imágenes en java por gioTema 14   imágenes en java por gio
Tema 14 imágenes en java por gio
 
Tema 13 gráficas en java por gio
Tema 13   gráficas en java por gioTema 13   gráficas en java por gio
Tema 13 gráficas en java por gio
 
Tema 12 hilos en java por gio
Tema 12   hilos en java por gioTema 12   hilos en java por gio
Tema 12 hilos en java por gio
 
Tema 11 expresiones regulares en java por gio
Tema 11   expresiones regulares en java por gioTema 11   expresiones regulares en java por gio
Tema 11 expresiones regulares en java por gio
 
Tema 10 clase abstractas e interfaz
Tema 10 clase abstractas e interfazTema 10 clase abstractas e interfaz
Tema 10 clase abstractas e interfaz
 
Tema 10 entrada y salida por gio
Tema 10   entrada y salida por gioTema 10   entrada y salida por gio
Tema 10 entrada y salida por gio
 
Tema 9 pruebas unitarias por gio
Tema 9   pruebas unitarias por gioTema 9   pruebas unitarias por gio
Tema 9 pruebas unitarias por gio
 
Tema 9 aplicaciones de dos capas por gio
Tema 9   aplicaciones de dos capas por gioTema 9   aplicaciones de dos capas por gio
Tema 9 aplicaciones de dos capas por gio
 
Tema 8 entrada y salida por gio
Tema 8   entrada y salida por gioTema 8   entrada y salida por gio
Tema 8 entrada y salida por gio
 
Tema 8 desarrollo de aplicaciones en java por gio
Tema 8   desarrollo de aplicaciones en java por gioTema 8   desarrollo de aplicaciones en java por gio
Tema 8 desarrollo de aplicaciones en java por gio
 
Tema 7 gui, swing y java beans por gio
Tema 7   gui, swing y java beans por gioTema 7   gui, swing y java beans por gio
Tema 7 gui, swing y java beans por gio
 
Tema 7 desarrollo de aplicaciones en java - lsia por gio
Tema 7   desarrollo de aplicaciones en java - lsia por gioTema 7   desarrollo de aplicaciones en java - lsia por gio
Tema 7 desarrollo de aplicaciones en java - lsia por gio
 
Tema 6 gui, swing y java beans por gio
Tema 6   gui, swing y java beans por gioTema 6   gui, swing y java beans por gio
Tema 6 gui, swing y java beans por gio
 
Tema 6 colecciones por gio
Tema 6   colecciones por gioTema 6   colecciones por gio
Tema 6 colecciones por gio
 
Tema 5 arreglos y cadenas por gio
Tema 5   arreglos y cadenas por gioTema 5   arreglos y cadenas por gio
Tema 5 arreglos y cadenas por gio
 
Tema 5 arreglos y cadenas - lsia por gio
Tema 5   arreglos y cadenas - lsia por gioTema 5   arreglos y cadenas - lsia por gio
Tema 5 arreglos y cadenas - lsia por gio
 

Tema4 herencia

  • 1. 1 Programación Orientada a Objetos en Java Gonzalo Méndez Pozo Dpto. de Ingeniería de Software e Inteligencia Artificial Universidad Complutense de Madrid Curso 2006 - 2007 Tema 4 – Herencia y Polimorfismo Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Herencia Tipo especial de relación entre clases Es uno de los aspectos que distinguen el Paradigma de Orientación a Objetos frente a otros paradigmas Mecanismo que, bien utilizado, facilita la modificabilidad y reutilización de los diseños y el código
  • 2. 2 Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Herencia ¿En qué consiste? 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 hija pasa a tener lo que tiene la clase padre Atributos Métodos Un objeto de la clase hija es también un objeto de la clase padre Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Herencia ¿En qué consiste? En la clase hija se definen las diferencias respecto de la clase padre ¿Para qué se usa? Para extender la funcionalidad de la clase padre Para especializar el comportamiento de la clase padre
  • 3. 3 Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Herencia 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 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 o bien se encuentra y se ejecuta o no se encuentra en ninguna de las superclases, de forma que el objeto no entiende ese mensaje M, dando como resultado el consiguiente error Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Herencia Ventajas Se ahorra código Permite reutilizar código extendiendo su funcionalidad 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 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 o clasificación. Si cambia el criterio de clasificación puede acarrear muchas modificaciones
  • 4. 4 Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Herencia en Java 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 siguen siendo públicos en la subclase 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. Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Herencia en Java class Punto2D { private int x,y; Punto2D (int x, int y) { this.x=x; this.y=y; } public void pintar () { … } } final class Punto3D extends Punto2D { private int z; Punto3D (int x, int y, int z) { super (x,y); this.z=z; } public void pintar() { super.pintar(); … } }
  • 5. 5 Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Clases Abstractas 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 significado en la clase base. 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, por tanto, aquella que tiene alguno de sus métodos definido pero no implementado Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Clases Abstractas 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 convenga public abstract class Animal { private String nombre; public abstract void sound(); public Animal (String nombre) { this.nombre= new String(nombre); } … }
  • 6. 6 Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Interfaces 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 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 Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Herencia de Interfaz Para heredar de una interfaz se usa la palabra reservada implements public class MiClase implements Serializable Reglas: Una interfaz puede heredar de otra interfaz Una clase (abstracta o no) puede heredar de una interfaz Una interfaz NO puede heredar de una clase Es un mecanismo muy usado en Java
  • 7. 7 Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Más sobre Herencia en Java Sólo se puede hacer herencia de implementación (extends) de una clase No se crean problemas de referencias circulares o alternativas a un método con la misma declaración Se puede hacer herencia de interfaz (implements) de todas las interfaces que se quiera Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Polimorfismo Gracias a la herencia, se puede interpretar que un objeto de una subclase es también un objeto de una superclase El polimorfismo 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 Interesa utilizarlo cuando un comportamiento varía en función del tipo de algo
  • 8. 8 Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Polimorfismo Se declaran atributos, parámetros o variables de la clase base Se les asignan objetos de alguna de las subclases Estamos seguros de que se pueden usar todos los métodos declarados en la clase base Si necesitamos usar métodos de las subclases es necesario hacer un cast Gonzalo Méndez - Dpto. Ingeniería de Software e Inteligencia Artificial Polimorfismo La utilización del cast aumenta la posibilidad de hacer conversiones erróneas, por lo que es mejor evitarlo Se puede preguntar por la clase a la que pertenece un objeto: instanceof objeto.getClass().getName() Es una mala idea. 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