POO II Unidad 1- Herencia Múltiple

46
UNIDAD I. CLASES Y HERENCIA

Transcript of POO II Unidad 1- Herencia Múltiple

Page 1: POO II Unidad 1- Herencia Múltiple

UNIDAD I. CLASES Y HERENCIA

Page 2: POO II Unidad 1- Herencia Múltiple

Contenido de la unidad   Definición de herencia, polimorfismo, sobrecarga e

invocación virtual de métodos.

  Modificadores de acceso.

  Creación de métodos y clases abstractas

  Creación y uso de interfaces

Page 3: POO II Unidad 1- Herencia Múltiple

Herencia   Las clases se relacionan entre si, formando una

jerarquía de clasificación.   Los objetos heredan las propiedades y el

comportamiento de todas las clases a las que pertenecen.

  Java únicamente permite la herencia simple.   La palabra clave extends indica que una clase

desciende de otra.   Todas las clases en Java son descendientes de la

clase llamada Object.

Page 4: POO II Unidad 1- Herencia Múltiple

Herencia   Métodos de la clase Object

  clone()

  equals(Object obj)

  finalize()

  getClass()

  hashCode()

  notify()

  notifyAll()

  toString()

  wait()

  wait(long timeout)

Page 5: POO II Unidad 1- Herencia Múltiple

Métodos de la clase Object clone()

protected Object clone () throws CloneNotSupportesException

  Crea y retorna una copia del objeto. El significado preciso de “copia” depende de la clase del objeto.

  La clase del objeto y de la copia son iguales.   Se crea una nueva instancia, pero no se hace llamando a

los constructores.   Si el objeto no soporta la interface Cloneable, entonces

se lanza la excepción para indicar que la instancia no puede ser clonada.

Page 6: POO II Unidad 1- Herencia Múltiple

Métodos de la clase Object equals

public boolean equals(Object obj)

  Indica cuando algún objeto “es igual a” este.

finalize protected void finalize()throws Throwable

  Llamada por el colector de basura de un objeto cuando se determina que ya no hay referencia hacia el objeto.

Page 7: POO II Unidad 1- Herencia Múltiple

Métodos de la clase Object getClass

public final Class getClass()

  Retorna el objeto de la clase que representa la clase de tiempo de ejecución del objeto.

hashCode public int hashCode()

  Retorna el valor del código hash del objeto.

Page 8: POO II Unidad 1- Herencia Múltiple

Métodos de la clase Object notify

public final void notify()

  Despierta un hilo que está esperando en el monitor de este objeto.

notifyAll public final void notifyAll()

  Despierta todos los hilos que están esperando en el monitor de este objeto.

Page 9: POO II Unidad 1- Herencia Múltiple

Métodos de la clase Object toString

public String toString()

  Retorna la representación “string” del objeto. Es recomendable sobrescribir éste método.

wait public final void wait()

throws InterruptedException

  Causa que un hilo espere mientras otro es invocado.

Page 10: POO II Unidad 1- Herencia Múltiple

Herencia   La clase derivada puede añadir nuevos atributos y

métodos y/o redefinir los atributos y métodos heredados.

  Una clase con el modificador final no puede tener clases derivadas.

  Un método con el modificador final no puede sobrescribirse.

  La herencia define una relación “es un” entre clases y objetos.

Page 11: POO II Unidad 1- Herencia Múltiple

Clases   Herencia:

Page 12: POO II Unidad 1- Herencia Múltiple

Herencia   Declaración:

public class subclase extends superclase

{

//código de la subclase

}

Page 13: POO II Unidad 1- Herencia Múltiple

Herencia   Acceso a miembros privados:

  Una subclase hereda todos los miembros de la superclase, incluido los privados pero no tiene acceso a éstos, ya que éstos sólo son accesibles desde el interior de la superclase.

  ¿Cómo se puede acceder a los miembros privados?

Mediante los métodos set/get ( si los métodos son heredados).

Mediante los constructores.

Page 14: POO II Unidad 1- Herencia Múltiple

Herencia : Constructores class Primera{ public Primera(){ System.out.println(“Constructor superclase”); }

} class Segunda extends Primera{ public Segunda(){ System.out.println(“Constructor subclase”); }

} public class Principal{ public static void main(String[] args){ Segunda s =new Segunda(); }

}

  Regla: Antes de ejecutarse el constructor de la clase se ejecuta el constructor de la superclase.

Constructor superclase Constructor subclase

Page 15: POO II Unidad 1- Herencia Múltiple

Herencia : Constructores   Explicación: El compilador de java, añade como primera

línea de código en todos los constructores de una clase la instrucción:

super(); //Llamada al constructor sin parámetros

  La llamada a otro constructor debe ser explícita, añadiendo como primera línea del constructor de la subclase la instrucción: super(argumentos);

Page 16: POO II Unidad 1- Herencia Múltiple

Herencia : Constructores   Usar otro constructor de la clase derivada: this(argumentos);/*Este constructor incluirá la llamada al constructor de la superclase */

  Ejemplo: public class PuntoColor extends Punto{ private String color; public PuntoColor(int x, int y, String c){ super(x,y); color=c; } public PuntoColor(int cord, String c){ this(cord,cord,c); } }

Page 17: POO II Unidad 1- Herencia Múltiple

Sobrescritura de métodos   Se realiza si los métodos de la clase base no se

ajustan a las necesidades de la nueva clase.   Reglas:

  Debe tener el mismo formato que el método de la superclase que sobrescribe (nombre, parámetros y tipo de devolución).

  Si conserva el nombre pero cambian los parámetros, entonces no se sobrescribe sino que se sobrecarga el método.

Page 18: POO II Unidad 1- Herencia Múltiple

Sobrescritura de métodos   Reglas:

  El método sobrescrito puede tener un modificador de acceso menos restrictivo que el de la superclase, pero nunca uno más restrictivo.   Ejemplo: Método en la superclase es protected y la

versión sobrescrita puede ser public.

  Para llamar desde el interior de la subclase a la versión original del método de la superclase

super.nombre_metodo(argumentos)

Page 19: POO II Unidad 1- Herencia Múltiple

Modificadores de acceso

Modificador de acceso

En el mismo paquete

En un paquete diferente

Subclase en el mismo paquete

Subclase en un paquete diferente

public

private × × × ×

protected ×

default × ×

Page 20: POO II Unidad 1- Herencia Múltiple

Clases abstractas   Definición:

Clase en la que alguno de sus métodos está declarado pero no está definido, es decir, se específica su nombre, parámetros y tipo de devolución pero no incluye código.

  Justificación: Se sabe que es requerido, pero no se conoce cómo debe ser su implementación. Sirve de base para futuras clases.

Page 21: POO II Unidad 1- Herencia Múltiple

Clases abstractas   Ejemplos:

Tenemos una clase abstracta Figura que incluye un método para calcular el área, el cuál depende de la figura que se tenga.

  Sintaxis: public abstract class Nombre_clase{ public abstract tipo nombre_metodo(arg);

//otros métodos }

Page 22: POO II Unidad 1- Herencia Múltiple

Clases abstractas   Aspectos importantes:

  Una clase abstracta puede tener métodos no abstractos.   No es posible crear objetos de una clase abstracta.   Las subclases de una clase abstracta están obligadas a

sobrescribir todos los métodos abstractos que heredan. En caso que no interese sobrescribir alguno de esos métodos, la subclase deberá ser declarada también abstracta.

  Puede tener constructores.

Page 23: POO II Unidad 1- Herencia Múltiple

Clases abstractas ¿Qué pasará cuando intentes compilar y ejecutar? abstract class Base{ abstract public void miFuncion(); public void otroMetodo(){ System.out.println("Otro Método"); } } public class Abs extends Base{ public static void main(String args[]){ Abs a = new Abs(); a.metodoA(); } public void miFuncion(){ System.out.println("Mi función"); } public void metodoA(){miFuncion(); } }

Page 24: POO II Unidad 1- Herencia Múltiple

Clases abstractas ¿Qué pasará cuando intentes compilar y ejecutar? abstract class Base{ abstract public void miFuncion(); public void otroMetodo(){ System.out.println("Otro Método"); } } public class Abs extends Base{ public static void main(String args[]){ Abs a = new Abs(); a.metodoA(); } public void miFuncion(int arg1){ System.out.println("Mi función"); } public void metodoA(){miFuncion(); } }

Page 25: POO II Unidad 1- Herencia Múltiple

Clases abstractas ¿Qué pasará cuando intentes compilar y ejecutar? class Base{ abstract public void miFuncion(); public void otroMetodo(){ System.out.println("Otro Método"); } } public class Abs extends Base{ public static void main(String args[]){ Abs a = new Abs(); a.metodoA(); } public void miFuncion(int arg1){ System.out.println("Mi función"); } public void metodoA(){miFuncion(); } }

Page 26: POO II Unidad 1- Herencia Múltiple

Clases abstractas ¿Qué pasará cuando intentes compilar y ejecutar? class Base{ public void miFuncion(); public void otroMetodo(){ System.out.println("Otro Método"); } } public class Abs extends Base{ public static void main(String args[]){ Abs a = new Abs(); a.metodoA(); } public void miFuncion(int arg1){ System.out.println("Mi función"); } public void metodoA(){miFuncion(); } }

Page 27: POO II Unidad 1- Herencia Múltiple

Constructores   Herencia permite a las subclases tener acceso a los

datos no privados del padre, excepto los constructores.

  Los constructores deben definirse en cada subclase.

  Un objeto sólo puede crearse con el operador “new” y una lista de argumentos que concuerde con uno de los constructores definidos en la clase.

  El compilador agregará el constructor nulo cuando si no se define ningún constructor de forma explicita.

Page 28: POO II Unidad 1- Herencia Múltiple

Constructores   Si una clase tiene más de un constructor, el compilador

no insertará el constructor nulo.

  Los constructores pueden sobrecargarse con diferentes lista de argumentos. Un constructor puede llamar a otro constructor. this(argumentos…)

  Un constructor permite ejecutar el cuerpo de su código hasta que el padre ha sido inicializada. Esto sucede porque el compilador agrega la llamada a super() .

  Si el padre no incluye al constructor nulo, se genera un error.

Page 29: POO II Unidad 1- Herencia Múltiple

Constructores   Una llamada a un constructor de la clase base puede

incluirse en el cuerpo de un constructor en la subclase.

  La llamada debe coincidir con uno de los constructores de la clase base y debe ser la primera instrucción del constructor de la subclase.

  Cuando los constructores sobrecargados llaman a otros con el enunciado this() debe ser la primera instrucción. En este caso la inicialización de la clase base debe ser la primera instrucción del constructor sobrecargado.

Page 30: POO II Unidad 1- Herencia Múltiple

Polimorfismo   Literalmente significa “muchas formas”.

  Mecanismo que adiciona flexibilidad a los programas.

Page 31: POO II Unidad 1- Herencia Múltiple

Polimorfismo class Employee { protected int empId; protected String name; public String getDetails(){ return name + "," + empId; } } class Teacher extends Employee{ private String classroom; private String grade; public String getDetails(){ return super.getDetails()+ "\n"+ classroom + "," + grade;

} }

Page 32: POO II Unidad 1- Herencia Múltiple

Polimorfismo   ¿Qué retorna cada llamada a getDetails? Employee e1 = new Employee(); Teacher t1 = new Teacher(); Employee e2 = new Teacher();

e1.getDetails(); t1.getDetails(); e2.getDetails(); //Invocación virtual

Page 33: POO II Unidad 1- Herencia Múltiple

Interfaces   Son la manera en que Java maneja la ausencia de la

herencia múltiple.   Se usa la palabra reservada interface.   Pueden ser usadas para desarrollar las siguientes

tareas:   Capturar similitudes entre clases no relacionadas sin

forzar artificialmente una relación entre las clases.   Declarar métodos que se espera que la clase

implemente.   Revelar la interface de programación de un objeto sin

revelar su clase.

Page 34: POO II Unidad 1- Herencia Múltiple

Interfaces   Define un nuevo tipo de referencia.   No provee implementación. Todos los métodos son

abstractos. El modificador abstract es usualmente omitido por convención.

  No pueden declararse métodos estáticos en una interface.

  Los atributos son implícitamente estáticos y constantes.   Debe ser pública.   No se tienen constructores.   Puede extender de otra interface.

Page 35: POO II Unidad 1- Herencia Múltiple

Interfaces   Declaración:

[public] interface NombreInterfaz [extends <NombreInterface1> [<NombreInterface2>, …]]{ }

  Cuerpo de la interfaz Definición de métodos y constantes de la interfaz.

Page 36: POO II Unidad 1- Herencia Múltiple

Interfaces

Page 37: POO II Unidad 1- Herencia Múltiple

Interfaces interface Flyer

+volar() +despegar() +aterrizar()

Aeroplano +volar()

+despegar() +aterrizar()

Pájaro +volar()

+despegar() +aterrizar()

Helicóptero +volar()

+despegar() +aterrizar()

Page 38: POO II Unidad 1- Herencia Múltiple

Interfaces versus Clases abstractas   Si una interface tiene muchos métodos, resulta tedioso

tener que implementarlos todos y más si su implementación es repetida.

  Una clase abstracta no necesariamente todos sus métodos son abstractos.

  Una interface no se puede modificar al momento de implementarla.

Page 39: POO II Unidad 1- Herencia Múltiple

Interfaces: Herencia múltiple

interface Flyer +volar()

+despegar() +aterrizar()

Aeroplano +volar()

+despegar() +aterrizar()

Pájaro

+volar() +despegar() +aterrizar()

+comer()

Helicóptero

+volar() +despegar() +aterrizar() +flotar()

Animal

+comer()

Vehículo

Page 40: POO II Unidad 1- Herencia Múltiple

Interfaces   Escriba una interfaz ColeccionSimple que declare los

siguientes métodos   estáVacía(): devuelve true si está vacía y false en caso

contario.   extraer(): devuelve y elimina el primer elemento de la

colección.   primero(): devuelve el primer elemento de la colección.   añadir(): añade un objeto por el extremo que corresponda y

devuelve true si se pudo añadir y false en caso contario.

  Escriba una clase PilaArray que implemente esta interfaz utilizando un arreglo y un contador de objetos.

Page 41: POO II Unidad 1- Herencia Múltiple

Interfaces   Escriba una clase, de nombre PruebaColeccionSimple, en

la que se implementen dos métodos:   rellenar(): recibe por parámetro un objeto de tipo

ColeccionSimple y añade los números del uno al diez.   imprimirYVaciar(): recibe por parámetro un objeto de tipo

ColeccionSimple y va extrayendo e imprimiendo los datos de la colección hasta que se quede vacía.

  En la aplicación principal cree un objeto de tipo PilaArray, llame a los métodos rellenar() e imprimirYVaciar() pasando este objeto por parámetros. Escriba en la pantalla el contenido antes y después de llamar a imprimirYVaciar().

Page 42: POO II Unidad 1- Herencia Múltiple

Interfaces   Escriba un programa para una biblioteca que contenga

libros y revistas.   Las características comunes que se almacenan tanto para las

revistas como para los libros son el código, el título y el año de publicación. Estas tres características se pasan por parámetro en el momento de crear los objetos.

  Los libros tienen además un atributo prestado. Los libros cuando se crean no están prestados.

  Las revistas tienen un número. En el momento de crear las revistas se pasa el número por parámetro.

  Las clases Libro y Revista se derivan de una clase Publicación.

Page 43: POO II Unidad 1- Herencia Múltiple

Interfaces   Escriba un programa para una biblioteca que contenga

libros y revistas (continuación):   Tanto las revistas como los libros deben tener (aparte de los

constructores) un método toString() que devuelve el valor de todos los atributos en una cadena de caracteres. También tiene un método que devuelve el año de publicación y otro para el código.

  Para prevenir posibles cambios en el programa se tiene que implementar una interfaz Prestable con los métodos prestar(), devolver() y prestado(). La clase libro implementa esta interfaz.

Page 44: POO II Unidad 1- Herencia Múltiple

Interfaces   Escriba una clase Proyecto para almacenar información

de los proyectos de fin de carrera. Esta clase hereda de Publicación (código, el título y el año de publicación) y añade un atributo que es el nombre de la carrera.

  Los objetos de esta clase se podrán prestar, por lo que debe implementar Prestable.

  Las publicaciones deben almacenarse almacenarse en un arreglo, el cuál debe estar ordenado usando el código.

  Debe incluir un método que devuelva toda la información de cada proyecto en un String.

Page 45: POO II Unidad 1- Herencia Múltiple

Interfaces   ¿Puede una interfaz heredar de otra interfaz?   ¿Puede una interfaz implementar otra interfaz?   ¿Puede una clase heredar de una interfaz?   ¿Puede una clase implementar una interfaz?   ¿Puede una clase heredar de otra clase?   ¿Puede una clase implementar otra clase?   ¿Puede una interfaz heredar de una clase?   ¿Puede una interfaz implementar una clase?

Page 46: POO II Unidad 1- Herencia Múltiple

UNIDAD I. CLASES Y HERENCIA