Unidad4 Programación Orientada a Objetos_p1

Page 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.

1


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 paquete locomoción, el nombre completo de Coche es locomoción.Coche.

2


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 3 importar java.awt no se importa java.awt.event.


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 su comportamiento, 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 ya construidas. Por ejemplo, las bicicletas de montaña, las de carretera y los tándems son todos, en definitiva, bicicletas. En términos de POO, son subclases o clases derivadas de la clase bicicleta. Análogamente, la clase bicicleta es la clase base o superclase de las bicicletas de montaña, las de carretera y los tándems. Esta relación se muestra en la siguiente figura. 4


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 redefinir las 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 realizar herencia múltiple en base a clases. Sin embargo es posible “simular” la herencia múltiple en base a las interfaces.( Lo veremos después de la herencia en este tema)

5


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.

6


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:

7


Unidad IV. Programaci贸n Orientada a Objetos

Herencia

8


Unidad IV. Programaci贸n Orientada a Objetos

Herencia

9


Unidad IV. Programaci贸n Orientada a Objetos

Herencia

10


Unidad IV. Programación Orientada a Objetos

Herencia Class 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 heredado coche1.repostar(12); // Método del coche, si tuviéramos una bicicleta no tendría este método }

}

11


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ándems tienen dos asientos y dos manillares; algunas bicicletas de montaña tienen una catalina adicional con un conjunto de marchas con relaciones de transmisión mucho más cortas. Las clases derivadas pueden incluso sobrescribir los métodos heredados y proporcionar 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 o jerarquía de clases puede ser tan extenso como necesitemos. Los métodos y las variables miembro se heredarán hacia abajo a través de todos los niveles de la jerarquía. Normalmente, cuanto más abajo está una clase en la jerarquía de clases, más especializado es su comportamiento. En nuestro ejemplo, podríamos hacer que la clase bicicleta derivase de una superclase de vehículos. 12


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 de objetos 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) 13


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.

14


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)

15


Unidad IV. Programaci贸n Orientada a Objetos

Herencia. Ejemplo

16


Unidad IV. Programación Orientada a Objetos

Clase Medico package ip; /** * * @author Toñy */ public class Medico { public boolean trabajaEnHospital; public void tratarPaciente(){ //Realizar un chequeo } }

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

Clase Medico General extiende de Medico package ip; /** * * @author Toñy */ public class MedicoGeneral extends Medico{ public boolean visitaLasCasas; public void aconsejaPacientes(){ //Ofrecer remedios caseros } } Clase cirujano tambien extiende de Medico package ip; /** * * @author Toñy */ public class Cirujano extends Medico{ public void tratarPaciente(){ //Realizar una operacion } public void hacerIncision(){ //Realizar la incision (!ouch!) } }

17


Unidad IV. Programaci贸n Orientada a Objetos

Ejemplo

18


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)

19


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 20


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 vehiculo gasolina = g } } 21


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. 22


Unidad IV. Programación Orientada a Objetos

Polimorfismo La palabra polimorfismo proviene del griego y significa que posee varias formas diferentes. 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.

23


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. 24


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); } }

25


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ódigo de 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 objeto designado por el nombre se crea en tiempo de ejecución; ligadura estática es una ligadura en la que la asociación nombre/clase se realiza cuando se declara el nombre (en tiempo de compilación) 26


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 } 27


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.

28


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"); } }

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

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); } }

29


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

30


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 coche Es un vehículo … 31


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 {}

32


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.. 33


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

34


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.