herencia y polimorfismo java

34
1 Unidad IV. Programación Orientada a Objetos Repaso(Paquetes) Un paquete es un conjunto de clases, lógicamente relacionadas entre sí, agrupadas bajo un nombre (por ejemplo, el paquete java.io agrupa las clases que permiten a un programa realizar la entrada y salida de información). Incluso, un paquete puede contener a otros paquetes. Los paquetes ayudan a organizar las clases en grupos para facilitar el acceso a las mismas cuando las necesitemos en un programa. La propia biblioteca de clases de Java está organizada en paquetes dispuestos jerárquicamente Para referirnos a una clase de un paquete, tenemos que hacerlo utilizando su nombre completo, excepto cuando el paquete haya sido importado. Las clases que guardamos en un fichero cuando escribimos un programa, pertenecen al paquete predeterminado sin nombre. De esta forma Java asegura que toda clase pertenece a un paquete.

Upload: felix-marin

Post on 21-Mar-2016

257 views

Category:

Documents


1 download

DESCRIPTION

Apuntes sobre herencia y polimorfismo en JAVA

TRANSCRIPT

Page 1: Herencia y Polimorfismo JAVA

1

Unidad IV. Programación Orientada a Objetos

Repaso(Paquetes)� Un paquete es un conjunto de clases, lógicamente relacionadas entre sí, agrupadas

bajo un nombre (por ejemplo, el paquete java.io agrupa las clases que permiten a un programa realizar la entrada y salida de información).

� Incluso, un paquete puede contener a otros paquetes.

� Los paquetes ayudan a organizar las clases en grupos para facilitar el acceso a las mismas cuando las necesitemos en un programa.

� La propia biblioteca de clases de Java está organizada en paquetes dispuestos jerárquicamente

� Para referirnos a una clase de un paquete, tenemos que hacerlo utilizando su nombre completo, excepto cuando el paquete haya sido importado.

� Las clases que guardamos en un fichero cuando escribimos un programa, pertenecen al paquete predeterminado sin nombre. De esta forma Java asegura que toda clase pertenece a un paquete.

Page 2: Herencia y Polimorfismo JAVA

2

Unidad IV. Programación Orientada a Objetos

Paquetes� Para que una clase pase a formar parte de un package llamado pkgName, hay que

introducir en ella la sentencia:

package pkgName;

� Si se usa tiene que ser la primera instrucción del programa Java.

� Todas las clases que forman parte de un package deben estar en el mismo directorio. Los nombres compuestos de los packages están relacionados con la jerarquía de directorios en que se guardan las clases.

� El nombre completo de una clase es el nombre del paquete en el que está la clase, punto, y luego el nombre de la clase. Es decir si la clase Coche está dentro del Es decir si la clase Coche está dentro del paquete locomoción, el nombre completo de Coche espaquete locomoción, el nombre completo de Coche es locomoción.Coche.

Page 3: Herencia y Polimorfismo JAVA

3

Unidad IV. Programación Orientada a Objetos

Paquetes� A veces resulta que un paquete está dentro de otro paquete, entonces habrá que

indicar la ruta completa a la clase.Por ejemplo locomoción.motor.Coche

� Mediante el comando import, se evita tener que colocar el nombre completo. El comando import se coloca antes de definir la clase. Ejemplo:

import locomocion.motor.Coche;

� Gracias a esta instrucción para utilizar la clase Coche no hace falta indicar el paquete en el que se encuentra, basta indicar sólo Coche. Se puede utilizar el símbolo asterisco como comodín.

Import locomocion.*; // Importa todas la clases del paquete locomoción

� Esta instrucción no importa el contenido de los paquetes interiores a locomoción (es decir que si la clase Coche está dentro del paquete motor, no sería importada con esa instrucción, ya que el paquete motor no ha sido importado, sí lo sería la clase locomoción.BarcoDeVela). Por ello en el ejemplo lo completo sería:

Import locomocion.*;import locomocion.motor.*;

� Esto es, al importar un package no se importan los sub-packages. Éstos deben ser importados explícitamente, pues en realidad son packages distintos. Por ejemplo, al importar java.awt no se importa java.awt.event.

Page 4: Herencia y Polimorfismo JAVA

4

Unidad IV. Programación Orientada a Objetos

Herencia� El mecanismo de herencia permite definir nuevas clases partiendo de otras ya

existentes. Las clases que derivan de otras heredan automáticamente todo sucomportamiento, pero además pueden introducir características particulares propias que las diferencian.

� Ejemplo:class Coche extends Vehículo

� Por defecto se heredan todos los métodos y propiedades protected y public (no se heredan los private). Además si se define un método o propiedad en la subclase con el mismo nombre que en la superclase, entonces se dice que se está redefiniendo el método, con lo cual no se hereda éste, sino que se reemplaza por el nuevo.

� La POO va más allá, permitiéndonos definir clases a partir de otras clases yaconstruidas. Por ejemplo, las bicicletas de montaña, las de carretera y los tándemsson todos, en definitiva, bicicletas. En términos de POO, son subclases o clasesderivadas de la clase bicicleta. Análogamente, la clase bicicleta es la clase base osuperclase de las bicicletas de montaña, las de carretera y los tándems. Esta relación se muestra en la siguiente figura.

Page 5: Herencia y Polimorfismo JAVA

5

Unidad IV. Programación Orientada a Objetos

Herencia� La herencia nos permite reutilizar el código.

� Si una clase deriva de otra (extends) hereda todas sus variables y métodos.

� La clase derivada puede añadir nuevas variables y métodos y/o redefinirlas variables y métodos heredados.

� En Java, a diferencia de otros lenguajes orientados a objetos, una clase sólo puede derivar de una única clase, con lo cual no es posible realizarherencia múltiple en base a clases.

� Sin embargo es posible “simular” la herencia múltiple en base a lasinterfaces.( Lo veremos después de la herencia en este tema)

Page 6: Herencia y Polimorfismo JAVA

6

Unidad IV. Programación Orientada a Objetos

Herencia

Cada subclase hereda los estados (en forma de declaración de variables) de la superclase de la cual deriva. Las bicicletas de montaña, las de carretera y los tándems comparten algunos estados: cadencia, velocidad...Además, cada subclase hereda los métodos de su superclase. Las bicicletas de montaña, las de carretera y los tándems comparten algunos comportamientos: frenar y cambiar la cadencia de pedaleo, por ejemplo.

Page 7: Herencia y Polimorfismo JAVA

7

Unidad IV. Programación Orientada a Objetos

Herencia� La herencia es una herramienta clave para abordar la resolución de un

problema de forma organizada, pues permite definir una relación jerárquica entre todos los conceptos que se están manejando.

� En UML se representa la relación de herencia mediante una flecha.

� Por ejemplo, ovejero alemán y caniche son diferentes razas de perros. En la terminología orientada a objetos "Ovejero Alemán" y "Caniche" son subclases de la clase perro. De forma similar Perro es la superclase de "Ovejero Alemán".

� Entonces tenemos la siguiente jerarquía de clases:

Page 8: Herencia y Polimorfismo JAVA

8

Unidad IV. Programación Orientada a Objetos

Herencia

Page 9: Herencia y Polimorfismo JAVA

9

Unidad IV. Programación Orientada a Objetos

Herencia

Page 10: Herencia y Polimorfismo JAVA

10

Unidad IV. Programación Orientada a Objetos

Herencia

Page 11: Herencia y Polimorfismo JAVA

11

Unidad IV. Programación Orientada a Objetos

HerenciaClass Vehículo {

public int Velocidad;public int ruedas;public void parar() {

Velocidad = 0;}

public void acelerar (int kmh){Velocidad += kmh;

}}

Class coche extends vehiculo {public int ruedas =4;public int gasolina;public void repostar (int litros) {

Gasolina += litros;}

}------------------------public class app{

public void static main(String[] args) {Coche coche1 = new coche();coche1.acelerar (80); // Método heredadocoche1.repostar(12); // Método del coche, si tuviéramos una bicicleta no tendría este método

}}

Page 12: Herencia y Polimorfismo JAVA

12

Unidad IV. Programación Orientada a Objetos

Herencia� Las clases derivadas no se encuentran limitadas por los estados y comportamientos

que heredan de su superclase. Muy al contrario, estas subclases pueden añadir variables y métodos a aquellas que han heredado. Los tándemstienen dos asientos y dos manillares; algunas bicicletas de montaña tienen unacatalina adicional con un conjunto de marchas con relaciones de transmisión muchomás cortas.

� Las clases derivadas pueden incluso sobrescribir los métodos heredados yproporcionar implementaciones más especializadas para esos métodos. Por ejemplo, si nuestra bicicleta de montaña tuviera una catalina extra, podríamos sobrescribir el método “CambiarDeMarcha” para poder usar esas nuevas marchas.

� Además, no estamos limitados a un único nivel de herencia. El árbol de herencias ojerarquía de clases puede ser tan extenso como necesitemos. Los métodos y lasvariables miembro se heredarán hacia abajo a través de todos los niveles de lajerarquía.

� Normalmente, cuanto más abajo está una clase en la jerarquía de clases, másespecializado es su comportamiento. En nuestro ejemplo, podríamos hacer que la clase bicicleta derivase de una superclase de vehículos.

Page 13: Herencia y Polimorfismo JAVA

13

Unidad IV. Programación Orientada a Objetos

Herencia� Las razones que justifican su necesidad son variadas:

� Modelado de la realidad. Son frecuentes las relaciones de especialización/generalización entre las entidades del mundo real, por tanto es lógico que dispongamos de un mecanismo similar entre las clases deobjetos

� Evitar redundancias. Toda la funcionalidad que aporta una clase de objetos es adoptada de manera inmediata por la clase que hereda, por tanto evitamos la repetición de código entre clases semejantes

� Facilitar la reutilización. Una clase no tiene por qué limitarse a recibir una serie de características de otra clase por herencia de forma pasiva. También disponen de cierto margen de adaptación de estas características

� Soporte al polimorfismo ( lo veremos más adelante)

Page 14: Herencia y Polimorfismo JAVA

14

Unidad IV. Programación Orientada a Objetos

Herencia

� Como se ha visto, las subclases heredan los métodos de las superclases. Pero es más, también los pueden sobrecargar para proporcionar una versión de un determinado método, haciendo una versión con número y/o tipo de parámetros distintos.

� Por último, si una subclase define un método con el mismo nombre, tipo y argumentos que un método de la superclase, se dice entonces que se sobrescribe o anula el método de la superclase.

Page 15: Herencia y Polimorfismo JAVA

15

Unidad IV. Programación Orientada a Objetos

Herencia

� Las clases por debajo en la jerarquía a una clase dada, se denominan subclases.

� Una clase puede ser superclase y subclase al mismo tiempo.

� Tipos de herencia:� Simple.� Múltiple (no soportada en Java)� Para indicar que una clase hereda de otra se utiliza la palabra

reservada (extends)

Page 16: Herencia y Polimorfismo JAVA

16

Unidad IV. Programación Orientada a Objetos

Herencia. Ejemplo

Page 17: Herencia y Polimorfismo JAVA

17

Unidad IV. Programación Orientada a Objetos

Clase Medicopackage ip; /** * * @author Toñy */public class Medico {

public boolean trabajaEnHospital; public void tratarPaciente(){

//Realizar un chequeo } }

Clase Medico General extiende de Medicopackage ip; /** * * @author Toñy */

public class MedicoGeneral extends Medico{ public boolean visitaLasCasas; public void aconsejaPacientes(){ //Ofrecer remedios caseros }

}Clase cirujano tambien extiende de Medicopackage ip; /** * * @author Toñy */public class Cirujano extends Medico{

public void tratarPaciente(){ //Realizar una operacion } public void hacerIncision(){ //Realizar la incision (!ouch!) }

}

Para que una clase herede de otra, utilizaremos el indicador extends en la declaración de la clase

Page 18: Herencia y Polimorfismo JAVA

18

Unidad IV. Programación Orientada a Objetos

Ejemplo

Page 19: Herencia y Polimorfismo JAVA

19

Unidad IV. Programación Orientada a Objetos

Ejercicios1Unidad4( Se entregarán para nota de prácticas 30%, junto con el resto de POO)

� Basándote en los ejemplos vistos en clase realiza los ejercicios de la relación 1 para las siguientes jerarquias de clases:

� Médico� Cuenta Corriente� Obra

� Relación: ( Ejercicios1Unidad4. doc)

Page 20: Herencia y Polimorfismo JAVA

20

Unidad IV. Programación Orientada a Objetos

Super� A veces se requiere llamar a un método de la superclase. Eso se realiza con la palabra reservada

super. Si this hace referencia a la clase actual, super hace referencia a la superclase respecto a la clase actual, con lo que es un método imprescindible para poder acceder a métodos anulados por herencia. Ejemplo:

Public class vehiculo {double velocidad;…..public void acelerar (double cantidad){

velocidad += cantidad;}

}Public class coche extends vehiculo {

double gasolina;public void acelerar(double cantidad) {

super.acelerar(cantidad);gasolina *= 0.9;

}}

� En el ejemplo anterior, la llamada super.acelerar(cantidad) llama al método acelerar de la clase vehículo (el cual acelerará la marcha). Es necesario redefinir el método acelerar en la clase coche ya que aunque la velocidad varía igual que en la superclase, hay que tener en cuenta el consumo de gasolina

Page 21: Herencia y Polimorfismo JAVA

21

Unidad IV. Programación Orientada a Objetos

Super� Se puede incluso llamar a un constructor de una superclase,

usando la sentencia super(). Ejemplo:

Public class vehiculo {double velocidad;public vehiculo (double v){

velocidad = v;}

}Public class coche extends vehiculo {

double gasolina;public coche(double v, double g){

super (v) // llama al constructor de la clase vehiculogasolina = g

}}

Page 22: Herencia y Polimorfismo JAVA

22

Unidad IV. Programación Orientada a Objetos

Super

� Por defecto Java realiza estas acciones:

� Si la primera instrucción de un constructor de una subclase es una sentencia que no es ni super ni this, Java añade de forma invisible e implícita una llamada super() al constructor por defecto de la superclase, luego inicia las variables de la subclase y luego sigue con la ejecución normal.

� Si se usa super(..) en la primera instrucción, entonces se llama al constructor seleccionado de la superclase, luego inicia las propiedades de la subclase y luego sigue con el resto de sentencias del constructor.

� Finalmente, si esa primera instrucción es this(..), entonces se llama al constructor seleccionado por medio de this, y después continúa con las sentencias del constructor. La inicialización de variables la habrá realizado el constructor al que se llamó mediante this.

Page 23: Herencia y Polimorfismo JAVA

23

Unidad IV. Programación Orientada a Objetos

Polimorfismo

� La palabra polimorfismo proviene del griego y significa que posee varias formasdiferentes. Este es uno de los conceptos esenciales de una programación orientada a objetos. Así como la herencia está relacionada con las clases y su jerarquía, el polimorfismo se relaciona con los métodos.

� El polimorfismo es un concepto de la programación orientada a objetos que nos permite programar en forma general, en lugar de hacerlo en forma específica.

� Como ejemplo tenemos el ecosistema, en donde todos los objetos de las distintas especies heredaban de una superclase llamada Animal, que brindaba la información general de cualquier animal, independiente de su especie. Sin embargo, cada especie hace un uso particular de cada uno de los métodos u operaciones de la clase Animal. El método comer() no se ejecutará de la misma manera en un León()o en un Pavo(). Lo mismo ocurre para métodos moverse() en objetos de tipo Tiburón() o Gallina(), aunque todas las especies realicen estos métodos.

Page 24: Herencia y Polimorfismo JAVA

24

Unidad IV. Programación Orientada a Objetos

Polimorfismo� El polimorfismo se puede establecer mediante la sobrecarga, sobre-escritura y la

ligadura dinámica.

� Sobrecarga

� Si para cada funcionalidad necesitada fuese necesario escribir un método, el código resultante sería inmanejable, imagínense, por ejemplo que los desarrolladores de java hubiesen creado un método para escribir en pantalla una cadena de texto, otro diferente para escribir un entero, otro para escribir un doble, otro para escribir un carácter, otro para una cadena y un entero y así para todas las combinaciones posibles, seria casi imposible conocer dichos métodos en totalidad; en cambio sabemos que con “System.out.print()” o “System.out.println()” podemos escribir cualquier mensaje en pantalla.

Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores.

La sobrecarga de métodos conduce a que un mismo nombre pueda representar distintos métodos con distinto tipo y número de parámetros, manejados dentro de la misma clase. En el ámbito de la POO, la sobrecarga de métodos se refiere a la posibilidad de tener dos o más métodos con el mismo nombre pero funcionalidad diferente. Es decir, dos o más métodos con el mismo nombre realizan acciones diferentes. El compilados usará una u otra dependiendo de los parámetros usados. Esto también se aplica a los constructores. De hecho, es la aplicación más habitual de la sobrecarga.

Page 25: Herencia y Polimorfismo JAVA

25

Unidad IV. Programación Orientada a Objetos

Polimorfismo� La forma de diferenciar varios métodos sobrecargados es a través de sus

parámetros, ya sea por la cantidad, el tipo o el orden de los mismos, veamos un ejemplo:

public class Articulo {

private float precio;

public void setPrecio() {precio = 3.50;

}public void setPrecio(float nuevoPrecio) {

precio = nuevoPrecio;}

public void setPrecio(float costo, int porcentajeGanancia) {precio = costo + (costo * porcentajeGanancia);

}}

Page 26: Herencia y Polimorfismo JAVA

26

Unidad IV. Programación Orientada a Objetos

Polimorfismo� Al redefinir métodos, objetos de diferentes tipos pueden responder

de forma diferente a la misma llamada (y podemos escribir códigode forma general sin preocuparnos del método concreto que se ejecutará en cada momento).

� Podemos añadirle a la clase Trabajador un método calcularPaga genérico (que no haga nada por ahora):

� Ligadura dinámica y estática:

Ligadura denota asociación de un nombre (como un declaración de un variable) con una clase; ligadura dinámica es una ligadura en la que la asociación nombre/clase no se realiza hasta que el objetodesignado por el nombre se crea en tiempo de ejecución; ligaduraestática es una ligadura en la que la asociación nombre/clase serealiza cuando se declara el nombre (en tiempo de compilación)

Page 27: Herencia y Polimorfismo JAVA

27

Unidad IV. Programación Orientada a Objetos

Polimorfismo

public class Trabajador…

public double calcularPaga (){ return 0.0; // Nada por defecto }

public class Empleado extends Trabajador…

public double calcularPaga (){ return (sueldo-impuestos); // NOMINA }

public class Consultor extends Trabajador…

public double calcularPaga (){ return horas*tarifa; // POR HORAS }

Page 28: Herencia y Polimorfismo JAVA

28

Unidad IV. Programación Orientada a Objetos

Polimorfismo� Como los consultores y los empleados son trabajadores, podemos crear un array de trabajadores

con consultores y empleados:

Trabajador trabajadores[] = new Trabajador[2];trabajadores[0] = new Empleado ("José", "123", 1500.0);trabajadores[1] = new Consultor ("Juan", "456", 10, 50.0);

…public void pagar (Trabajador trabajadores[]){

int i;for (i=0; i<trabajadores.length; i++)

realizarTransferencia ( trabajadores[i],trabajadores[i].calcularPaga());}

� Una vez que tenemos un vector con todos los trabajadores de una empresa, podríamos crear un programa que realizase los pagos correspondientes a cada trabajador de la siguiente forma:

� Para los trabajadores del vector anterior, se realizaría una transferencia de 1200 a José suponiendo que los impuestos son 300 otra transferencia, esta vez de 500 a Juan ( 10horas a 50 euros)

� La ligadura dinámica sólo se da utilizando apuntadores o referencias.

Page 29: Herencia y Polimorfismo JAVA

29

Unidad IV. Programación Orientada a Objetos

Polimorfismo ejemplo� class Mamifero {

public void mover() {System.out.println("Ahora es un mamífero el que se mueve");

}}

class Perro extends Mamifero {public void mover() {

System.out.println("Ahora es un perro el que se mueve");}

}

Gato extends Mamifero {public void mover() {

System.out.println("Ahora es un gato el que se mueve");}

}

public class Polimorfismo {public static void muevete(Mamifero m) {

m.mover();}public static void main(String[] args) {

Gato paco = new Gato();Perro chus = new Perro();muevete(paco);muevete(chus);

}}

Tendríamos que estar comprobando M de que tipo es… si m es de tipo perro entonces MoverPerro, sino MoverGato y tendriamos un montón de metodos distintos y asi con todos los tipos que tengamos definidos

Page 30: Herencia y Polimorfismo JAVA

30

Unidad IV. Programación Orientada a Objetos

Polimorfismo ejemplo� Tenemos un doctor, un actor y un peluquero.

� A los tres se les da la orden de corte� entonces como lo tomara cada uno?

� El doctor al decirle corte hara una incision con el bisturí� El actor al decirle corte para abruptamente su escena � El peluquero al decirle corte cortara su cabello

Page 31: Herencia y Polimorfismo JAVA

31

Unidad IV. Programación Orientada a Objetos

instanceof� Permite comprobar si un determinado objeto pertenece a una clase concreta. Se

utiliza de esta forma:objeto instanceof clase

� Comprueba si el objeto pertenece a una determinada clase y devuelve un valor true si es así. Ejemplo:

Coche miMercedes = new Coche();if (miMercedes instanceof coche)

System.out.println(“ Es un coche”);if (miMercedes instanceof vehiculo)

System.out.println(“ Es un vehiculo”);if (miMercedes instanceof camión)

System.out.println(“ Es un camión”);

� En el ejemplo anterior aparecerá en pantalla:

Es un cocheEs un vehículo…

Page 32: Herencia y Polimorfismo JAVA

32

Unidad IV. Programación Orientada a Objetos

La clase Object

� Todas las clases que se escriben, excepto el caso especial de las interfaces, son de forma automática subclases de la clase raíz que incluye Java, llamada Object (objeto).

� La clase Object pertenece a una de las clases estándares de Java, se encuentra en java.lang.Object, en términos generales se dice que la clase Object se encuentra en a raiz de la jerarquía de clases. Por tanto, todos los objetos ya han heredado algunos métodos que están preparados para usarlos.

Class persona { }

Es lo mismo que decir

Class persona extends Object {}

Page 33: Herencia y Polimorfismo JAVA

33

Unidad IV. Programación Orientada a Objetos

Métodos de la clase Object� La clase Object tiene métodos interesantes para cualquier objeto que son heredados

por cualquier clase. Entre ellos se pueden citar los siguientes:

� Métodos que pueden ser redefinidos por el programador:

� clone() Crea un objeto a partir de otro objeto de la misma clase. El método original heredado de Object lanza una CloneNotSupportedException. Si se desea poder clonar una clase hay que implementar la interface Cloneable y redefinir el método clone(). Este método debe hacer una copia miembro a miembro del objeto original. No debería llamar al operador new ni a los constructores.

� equals() Indica si dos objetos son o no iguales. Devuelve true si son iguales, tanto si son referencias al mismo objeto como si son objetos distintos con iguales valores de las variables miembro.

� toString() Devuelve un String que contiene una representación del objeto como cadena de caracteres, por ejemplo para imprimirlo o exportarlo.

� finalize() Libera los recursos del sistema, ficheros abiertos, conexiones etc..

Page 34: Herencia y Polimorfismo JAVA

34

Unidad IV. Programación Orientada a Objetos

Métodos de la clase Object

� Métodos que no pueden ser redefinidos (son métodos final):

� getClass() Devuelve un objeto de la clase Class, al cual se le pueden aplicar métodos para determinar el nombre de la clase, su super -clase, las interfaces implementadas, etc. Se puede crear un objeto de la misma clase que otro sin saber de qué clase es.

� notify(), notifyAll() y wait() Son métodos relacionados con las threads y se verán el año que viene