Post on 25-Jun-2015
UNIDAD I. CLASES Y HERENCIA
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
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.
Herencia Métodos de la clase Object
clone()
equals(Object obj)
finalize()
getClass()
hashCode()
notify()
notifyAll()
toString()
wait()
wait(long timeout)
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.
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.
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.
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.
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.
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.
Clases Herencia:
Herencia Declaración:
public class subclase extends superclase
{
//código de la subclase
}
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.
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
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);
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); } }
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.
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)
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 × ×
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.
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 }
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.
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(); } }
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(); } }
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(); } }
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(); } }
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.
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.
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.
Polimorfismo Literalmente significa “muchas formas”.
Mecanismo que adiciona flexibilidad a los programas.
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;
} }
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
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.
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.
Interfaces Declaración:
[public] interface NombreInterfaz [extends <NombreInterface1> [<NombreInterface2>, …]]{ }
Cuerpo de la interfaz Definición de métodos y constantes de la interfaz.
Interfaces
Interfaces interface Flyer
+volar() +despegar() +aterrizar()
Aeroplano +volar()
+despegar() +aterrizar()
Pájaro +volar()
+despegar() +aterrizar()
Helicóptero +volar()
+despegar() +aterrizar()
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.
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
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.
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().
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.
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.
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.
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?
UNIDAD I. CLASES Y HERENCIA