Вы находитесь на странице: 1из 46

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(); Constructor superclase
} Constructor subclase
}
  Regla: Antes de ejecutarse el constructor de la clase se
ejecuta el constructor de la superclase.
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 En el mismo En un Subclase en Subclase en


de acceso paquete paquete el mismo un paquete
diferente 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 Pájaro Helicóptero


+volar() +volar() +volar()
+despegar() +despegar() +despegar()
+aterrizar() +aterrizar() +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 Animal


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

Aeroplano Pájaro Helicóptero


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

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

Вам также может понравиться