Sunteți pe pagina 1din 15

Tema 1

1- Conceptos de Java para Estructuras de Datos

Índice general:
Tema 1- Conceptos de Java para 1. Clases y Objetos en Java
El Principio de la Programación Orientada a Objetos de la Herencia y
Estructuras de Datos 2.
su Soporte en Java
3
3. El Polimorfismo en Java
4. Más Herencia en Java: Métodos y Clases Finales y Abstractos.
5. Herencia Múltiple: Interfaces Java
Germán Moltó
Escuela Técnica Superior de Ingeniería Informática
Uni ersidad Politécnica de Valencia
Universidad

1 2

Objetivos y Bibliografía Objetos y Clases en Java (I)


 Objetivos:  En Java todo son objetos (i.e. instancias de una Clase dada),
 Conocer los conceptos básicos de la POO y su soporte en el exceptuando los 8 tipos primitivos (i.e. byte, short, int, long,
lenguaje Java float, double, char y boolean).
 Aprender el concepto de Herencia en Java para afrontar el  Una Clase consta de un conjunto de atributos (almacenan
desarrollo de estructuras de datos y algoritmos que se realiza en
temas posteriores.
datos) y un conjunto de métodos (trabajan con esos datos).
 Estudiar el concepto de paquete como mecanismo para la  Un Objeto de una Clase se usa/manipula desde cualquier
agrupación de clases. método de otra Clase, como por ejemplo TestClase.
 Comprender el concepto de Polimorfismo, Interfaz y Clase
public class TestClase {
Ab
Abstracta, asíí como su utilidad.
ilid d
public static void main( String args[] ){ ... }
 Bibliografía:
}
 Weiss, M.A.
Weiss M A Estructuras de datos en Java
Java. Adisson-Wesley,
Adisson-Wesley 2000.
2000
Capítulos 2 (Apartado 2.5) 3 y 4
 Arnow, D., Weiss G. Introducción a la Programación con Java. Un  Ejemplo: sea TestCirculo una aplicación que maneja Círculos,
enfoque
f orientado
i t d a objetos.
bj t Adisson-Wesley,
Adi W l 2001.2001 Capítulo
C ít l 14 i e Objetos de la clase Circulo
i.e.
3 4
Objetos y Clases en Java (II) Objetos y Clases en Java (III)
public class TestClase {
p public class TestClase {
p
public static void main( String args[] ){ public static void main( String args[] ){
¿? Circulo c1 = new Circulo();
} Circulo c2;
} c2 = c1;
}
 ¿Qué podemos hacer con un objeto? }
 Especificación de una Clase: descripción de QUÉ se puede
hacer con un Objeto, es decir, qué métodos expone  Creación de Objetos de una Clase:
(especificación de Circulo).
 Implementación de una Clase: detalles internos de CÓMO  c1 es una variable Referencia al nuevo Objeto
j creado.
se satisface la Especificación o cómo se consigue hacer lo que  c2 es una variable Referencia a ningún Objeto, i.e. tras la
se hace con un Objeto. declaración Circulo c2 ; c2 == null
 ¿ Qué ocurre si se ejecuta c2 = c1; ?
5 6

Referencias en Java Ejemplo de Utilización de Objetos Circulo


 Una variable Referencia almacena la dirección de memoria en  Podemos crear un objeto
j de la clase Circulo de la manera
la que se encuentra el Objeto al que referencia. especificada en los constructores que define la clase.
0 public class TestCirculo {
p
public static void main( String args[] ){
102 102 Circulo c1 = new Circulo();
c1 double radio = 4.0;
408 Color color = Color.red;
Circulo c1 = new Circulo(); Circulo c2 = new Circulo(radio,
Circulo(radio color);
System.out.println(c2);
• Al hacer: Memoria System.out.println(c2.toString());
y p ( g());
• Circulo c2 = c1; }
¿Qué diferencia hay en las
• La variable referencia c2 pasa a tener el mismo valor que }
dos últimas invocaciones?
c1, es decir, ambas apuntan al mismo objeto.
7 8
Implementación de una Clase: Definición de
Implementación de una Clase Atributos
 Implementación de una Clase:  Los Atributos de una Clase almacenan los datos de la Clase
 Detalles internos de cómo se satisface la Especificación o cómo se  Modelo de la relación TIENE UN(A)
consigue hacer lo que se hace sobre un Objeto.  Modificadores de atributos
 Componentes de una Clase:  Ej
Ejemplo:
l definición
d fi i ió de
d los
l Atributos
A ib de
d la
l Clase
Cl Circulo
Ci l
 Atributos, que almacenan los datos de la Clase private double radio;
 Métodos que definen la funcionalidad de la Clase mediante,
Métodos, mediante por lo private String color;
general, la manipulación de los atributos. private static final double RADIO_POR_DEFECTO = 3.0;
 Elementos qque aparecen
p en la implementación
p de una clase: private static final Color COLOR_POR_DEFECTO = Color.black;
 El operador this. • Por lo general, los atributos se suelen definir privados y se definen
 Modificadores estáticos, dinámicos y finales de una Clase y sus métodos consultores y modificadores. De esta manera se garantiza la
componentes. encapsulación u ocultación de datos. datos
 Modificadores de visibilidad public y private de una Clase y sus • Modificador static: Permite definir variables a nivel de clase (compartidas
componentes
componentes. por todos los objetos).
• Modificador final: Impide asignar un nuevo valor al atributo.
9 10

Implementación de una Clase: Definición de Implementación de una Clase: Definición de


Constructores Métodos (I)
 Los Métodos de una clase definen su funcionalidad.
 Los Constructores de una clase p permiten dar un valor
 Ejem l : Definición de Métodos Consultores en la clase
Ejemplo:
inicial a los atributos del objeto. Ejemplo: definición de los Circulo.
métodos Constructores de Circulo  Al definir como privados todos los atributos de Circulo, se deben
proporcionar
i métodos
é d para acceder d a su valor.
l
public Circulo() {
radio = RADIO_POR_DEFECTO; public double getRadio() { Se p
podría utilizar this ppara referenciar a
color = COLOR_POR_DEFECTO; this hace referencia al objeto los atributos (i.e., this.radio) pero no es
sobre el que se invoca el método
return radio; necesario puesto que no hay aliasing de
}
public Circulo(double radio,
radio Color color) { y sirve ppara evitar el aliasingg de } nombres.
nombres.
this.radio = radio;
this.color = color; public Color getColor() {
} return
t color;
l
public Circulo(){ }
this(RADIO_POR_DEFECTO,
( COLOR_POR_DEFECTO); )
}
11 12
Implementación de una Clase: Definición de Implementación de una Clase: Definición de
Métodos (II) Métodos (III)
 Al definir como pprivados todos los atributos de Circulo,  Ejemplo:
j p definición de otros Métodos de Circulo
se deben proporcionar métodos para modificar su valor. public double area() { return Math.PI * radio * radio; }
 Ejemplo: definición de los Métodos Modificadores de ppublic Stringg toString()
g() {{return “Circulo de radio “ + radio}}
Circulo public static Circulo leerCirculo(Scanner teclado) { ... }

public void setRadio(double nuevoRadio) {  El uso de un método estático permite definirlo a nivel de
radio = nuevoRadio; clase, no a nivel de instancia (objeto individual).
}  Se deberá invocar como Circulo.leerCirculo(...).
public void setColor(Color nuevoColor) {
color = nuevoColor; Utilizar diferentes nombres para el ¿Se podría utilizar this en la
} argumento y el atributo evita el aliasing y implementación del método area para
ya no es necesario utilizar this.
this referenciar al atributo radio?

13 14

Estado Actual de la Clase Circulo Ejercicios Propuestos


public class Circulo {  Ejercicio 1: Escribe la clase Manzana que tiene un sabor, de tipo
private double radio; entero que representa una escala [0,10].
[0 10]
private Color color;
 Por defecto, la manzana tiene un sabor de 5, aunque se puede especificar
private static final double RADIO_POR_DEFECTO = 3.0; su sabor al crearla.
private static final Color COLOR_POR_DEFECTO
COLOR POR DEFECTO = Color.black;
Color black;
 Ejercicio 2: En lugar de trabajar con Círculos, se desea trabajar con
/** crea un Circulo con radio r y color c */ otro tipo de Figuras (Cuadrados o Rectángulos o Triángulos). Si ya
public Circulo(Color c,
c double r) { se dispone
p de la aplicación
p misCirculos, ¿¿cómo se afrontaría el
this.color = c; diseño e implementación de la nueva aplicación?
this.radio = r;  Ejercicio 3: Se desea realizar una aplicación que maneje un grupo
} de Círculos.
Círculos En particular,
particular se desea:
/** crea un Circulo estándar.: radio 3.0, color negro y centro en el origen*/  Construir el grupo con varios Circulos, mostrar el grupo por pantalla y
public Circulo() { obtener el área del grupo.
this(COLOR_POR_DEFECTO,
hi (COLOR POR DEFECTO RADIO RADIO_POR_DEFECTO);
POR DEFECTO) Siguiendo los pasos dados para la presentación de la aplicación
} misCirculos, desarrolla la aplicación que maneje un grupo de
… Círculos ((GrupoDeCirculos).
p )
}
15 16
Paquetes Java: Reutilización de Código Paquetes Java: Reglas de Utilización
 El mecanismo Java más general para organizar un grupo de  La Clase C del Paquete
q p se especifica
p como p
p.C
Cl
Clases que guardan
d alguna
l relación
l ió entre síí es ell Paquete
P t
public class MiClase(){
 Paquetes Java estándar ...
 java.lang : Contiene, entre otras, las clases Integer, Math, String y j
java.util.Date
il D t fecha
f h = new java.util.Date();
j il D t ()
System
...
 java.util : Contiene, entre otras, las clases Date, Random y
StringTokenizer
g }
 java.io, java.awt (incluye la clase Color), etc.
 Manipulación:  Simplificación: uso de la directiva import (antes de la
 lla di
directiva
ti import;
i t la
l variable
i bl dde entorno
t CLASSPATH la
CLASSPATH; l
declaración de la clase).
instrucción package. import java.util.*;
 Reglas de visibilidad dentro y fuera de un paquete. public class MiClase(){
 Es posible investigar los paquetes que incluye el API de Java ...
mirando la documentación: Date fecha = new Date();
 http://java sun com/javase/6/docs/api/
http://java.sun.com/javase/6/docs/api/ ...
}
17 18

Paquetes Java: Reglas de Creación Paquetes Java: Reglas de Visibilidad


 Para indicar que una Clase C pertenece al Paquete p:
 Los Paquetes tienen varias reglas de visibilidad importantes:
 la primera línea del fichero C
C.java
java es package p;
 el fichero C.java debe estar en el subdirectorio p
 El subdirectorio p debe de encontrarse en la lista de la variable de 1. Si una Clase o cualquiera de sus componentes no posee
entorno CLASSPATH modificador de visibilidad alguno (public,
(public private o protected) sólo
es visible (puede ser referenciada) para las demás clases dentro del
 Por ejemplo: La clase MiClase del paquete org.grycap.paquete mismo Paquete. Esto se conoce como ACCESO FRIENDLY.
deberá estar en la ruta:
 org/grycap/paquete/MiClase.java
2. Sólo las clases públicas de un paquete se pueden usar fuera de él
 Para que el compilador/enlazador encuentre esa clase durante el
proceso de compilación el directorio debe estar incluido dentro de 3. Todas las clases que no forman parte de un paquete, pero se
la lista de directorios de la variable de entorno CLASSPATH. ppueden alcanzar a través de la variable CLASSPATH se consideran
 Los IDEs (Entorno de Desarrollo Integrado) evitan tener que manipular parte del mismo paquete y el acceso amistoso se aplica entre ellas
de manera directa dicha variable.
 Ejemplo: HerramientasPreferenciasLibrerías (BlueJ)

19 20
Modificadores de Visibilidad: Tabla
Ejercicio de Modificadores de Visibilidad Resumen

 Modificadores de visibilidad aplicados


p tanto a una clase como
package org.grycap.paquete; package org.grycap.otropaquete;
a cualquiera de sus miembros (atributos y métodos).
class Clase1{ import org.grycap.paquete.*;
private int aPrivado; public class Clase2{
Visibilidad Clase Paquete Subclase Mundo
int otroAtributo; public static void main(String args[]){ Modificador
} C
Clase1 c1 = new Clase1();
C () private Sí No No No
• ¿La creación en Clase 2 es correcta? }}
Clase 1 NO tiene modificador de ninguno Sí Sí No No
visibilidad  Acceso friendly (solo package org.grycap.paquete;
accesible desde clases del mismo public class Clase3{
ppaquete).
q ) Clase 2 ppertenece a otro protected Sí Sí Sí No
paquete: org.grycap.paquete.Clase1 is not public static void main(String args[]){
public in org.grycap.paquete; cannot be
accessed from outside package.
Clase1 c1 = new Clase1(); public Sí Sí Sí Sí

• ¿Y la de Clase 3? Acceso Correcto }}


21 22

Reutilización de Código: Tipo de Relación y


Herencia en Lenguajes de POO y su Soporte
Mecanismo Java
en Java

Mecanismo Java para representar una  Introducción al concepto p de Herencia y su soporte


p en
Relación entre Clases
relación Java. En particular, se incidirá en los siguientes aspectos:
 Características y sintaxis de la Herencia en JJava
P
Paquete
t
Existe alguna relación entre las clases,  La clase Object y el modelo de jerarquía de Clases Java
Ejemplos: Clases de java.util,
aunque no realicen la misma funcionalidad.  Características de una clase derivada
javax.swing, etc.
 Modificadores de visibilidad.
Definición de Atributos
Existe una relación TIENE UN(A) o  Constructores de la derivada.
relación de composición entre las Clases Ejemplos: Circulo y grupoCirculos  S
Sobrescritura de métodos.
é
 Ejemplos: Diseño de la clase Figura y reformulación de
Herencia Java
Ci
Circulo
l para que sea una ded sus derivadas.
d i d Diseño
Di ñ de
d la
l
Existe una relación relación ES UN(A) o Ejemplos: clase base Figura y sus
relación jerárquica entre las Clases derivadas Circulo, Rectangulo, ... clase GrupoDeFiguras.

23 24
Ejercicio de Persona
La relación ES UN(A) Ejemplo de relación ES UN(A)
 Si X ES UN(A)
( ) Y,  Jerarquía de clases de figuras:
Objeto
 se dice que la Clase derivada X es una variación de la Clase base Y  Un círculo ES UNA figura
 se dice que X e Y forman una Jerarquía: X  Y, donde la Clase X es  Un rectángulo ES UNA figura
una subClase de Y e Y es una superClase de X  Un cuadrado ES UN Rectángulo
Figura
 la relación es transitiva: si X ES UN(A) Y e Y ES UN(A) Z, entonces
X ES UN(A) Z

Círculo Rectángulo
Y (Base) Ejemplo: ¿Qué relación guardan
entre sí un cuadrado, un triángulo, un  La Herencia permite modelar una
círculo y un rectángulo?
g Cuadrado
relación de tipo ES UN.
UN
X (Derivada)
 Permite definir una jerarquía de clases.

25 26

El Mecanismo de la Herencia Herencia: Sintáxis básica de Java


 La Herencia permite la formación de public class Derivada extends Base{
Y (Base)
Jerarquías de Clases para reutilizar código. …
 X hereda (puede referenciar) todos los }
atributos y métodos que no sean privados X (Derivada)  Los atributos y métodos no privados de Base se heredan
en Y. en Derivada (salvo los constructores).
 X es una clase completamente nueva e independiente.  Esto significa que dichos atributos pueden ser referenciados y
 Los cambios que sufra X NO afectan a Y, lo que simplifica el dichos métodos pueden ser invocados.
mantenimiento del código.  Usos del operador super:
 X es de tipo compatible con Y.  Referenciar a cualquier componente de Base (atributos,
 Una referencia de tipo Y es polimórfica. Sin embargo, no son métodos
é d o constructores), ) aunque no es muy común. ú
compatibles ni Y con X, ni X con sus clases hermanas.  Se suele utilizar para invocar constructores de la clase padre y
en casos de sobreescritura parcial de métodos.
métodos
27 28
Herencia: Métodos Constructores de una
Ejemplo Básico de Herencia Clase Derivada
public class Animal{  La clase Derivada debe definir explícitamente sus propios
public class Leon extends Animal {
constructores.
constructores
protected String queHablo; public Leon(){
 En caso contrario, Java proporciona el constructor por defecto:
public Animal(){ queHablo = “Grawl!”;
public Derivada(){
queHablo = “Groar!”;
Groar! ; }
super();
()
}
} }
public String rugir(){  Constructor por defecto:
return queHablo;  Invoca al constructor sin parámetros de base (inicializando los
}} atributos heredados de Base) y luego inicializando al valor por
defecto a los atributos heredados de Derivada.

public class TestLeon { ¿Qué saca por pantalla  Implicaciones:


public static void main (String args[]){ este código?
Leon l = new Leon();
 Si la clase Base NO define un constructor por defecto (sin
argumentos), la clase Derivada obligatoriamente deberá definir un
System.out.println(l.rugir()); constructor que invoque al de la clase Base con los argumentos
} correspondientes.
}
29 30

Ejemplo: Definición de Constructores Ejercicio: Modificadores de Visibilidad


 Constructores de la clase Figura: public class Base{
public
bli int
i t bPublico;
bP bli protected
t t d int
i t bProtegido;
bP t id private
i t int
i t bPrivado;
bPrivado
public Figura(Color c, String t) {this.color = c; this.tipo = t; } }
ppublic Figura(){
g (){ this(COLOR
( _POR_DEFECTO,, TIPO_POR_DEFECTO);
); } public class Derivada extends Base{
public
bli int
i dPublico;
dP bli private
i i dPrivado;
int dP i d
 Constructores de la clase Circulo, en base a los de la clase Figura: }
public class Test {
public Circulo(Color c, double r){ public static void main(String args[]){
super(c, "Circulo"); Base b = new Base();
Derivada d = new Derivada();
this.radio = r;; System out println(b bPublico + " " + b.bProtegido
System.out.println(b.bPublico b bProtegido + " " + b.bPrivado);
b bPrivado);
} System.out.println(d.dPublico + " " + d.dPrivado);
}
public Circulo() {
} // NOTA: Se asume que todas las clases pertenecen al mismo paquete.
super(); //  No es necesaria ya que se realiza automáticamente.
this.radio = RADIO_POR_DEFECTO; 1. En el main de Test, ¿Qué accesos son incorrectos?
} 2. Si main fuera un método de Base, ¿Qué accesos serían incorrectos?
3. Si main fuera un método de Derivada, ¿Qué accesos serían incorrectos?
31 32
Herencia en Java: Sobrescritura de un Ejemplo de sobrescritura del método
método de la Clase Base toString de Figura en la clase Circulo (I)
 Cualquier método no privado de Base que se defina de  La clase Object es la raíz de la jerarquía de herencia en
nuevo en derivada se sobrescribe. Java
 Para ello, definimos en Derivada un método:  Cualquier clase hereda implícitamente de la clase Object
 Con la misma signatura que en Base (nombre del método y  Método toString():
lista de parámetros).  Especificación: public String toString();
 Con el mismo tipo de resultado que en Base.  Imlementación: [Object.java]
 Sin añadir excepciones a lista de throws del método definido en  Método toString de la clase Figura (sobrescritura del
Base.
Base
método definido en Object):
 Sobreescritura parcial:  public String toString(){
 Cuando
C d no se desea
d cambiar
bi completamente
l t t ell return “Figura de tipo “ + tipo + “ color” + color + “centro “
comportamiento del método de la clase Base. Se utiliza super + centro;
para invocar el método de la clase Base.
p
}
33 34

Ejemplo de sobrescritura del método


toString de Figura en la clase Circulo (II) Ejemplo de Sobreescritura: Equals
 Método toString en la clase Circulo (sobrescritura del  El método equals está definido e implementado en la
método definido en Figura) clase Object
 public String toString(){  Permite decidir si dos referencias (objetos) son iguales.
return “Circulo de radio” + radio + “ color” + color + “  Criterio por defecto: Dos referencias son iguales si apuntan
centro” + centro; exactamente al mismo objeto.
}  El criterio
i i pueded ser modificado
difi d para objetos
bj de
d una
 Método toString en la clase Circulo (sobrescritura parcial clase sobreescribiendo el método equals (Ej. Figura):
d l método
del ét d definido
d fi id en Figura)
Fi )  Respetar ell perfil
R fil (cabecera)
( b )ddell método
é d equalsl
 public String toString(){  Modificar criterio atendiendo a los atributos de la clase.
ret rn super.toString()
return s er t Strin () + “ y radi
radio”” + radio;
radi ; public
bli boolean
b l equals(Object
l (Obj t x){ ){
Figura f = (Figura) x;
} return (color.equals(f.color) && tipo.equals(f.tipo));
}

35 36
Ejercicio de Yogures
Polimorfismo en Java Enlace Dinámico
 El polimorfismo es una consecuencia directa de la Herencia:  Ante situaciones de sobreescritura de métodos, el método a
 Una variable referencia de una clase Base puede referenciar a ejecutar
j es ell d
definido
fi id por ell tipo
i di dinámico
á i d de lla variable
i bl
objetos tanto de la clase Base como de cualquier clase Derivada de polimórfica.
esta.
 Toda variable referencia tiene siempre dos tipos:  Se aplica
p en tiempop de ejecución,
j , pprevia comprobación
p del
acceso en la clase del tipo estático.
 Tipo estático:
 El tipo con el que ha sido declarada la variable (nunca varía)
 Tipo dinámico: ClaseBase ClaseBase cb = new ClaseDerivada();
 El tipo del objeto al que referencia en tiempo de ejecución (puede variar) cb.miMetodo();
 Si ambos tipos
p no coinciden, entonces la variable es ppolimórfica. +miMetodo()
 Ejemplo:
 Figura f = new Rectangulo();
 La variable f es polimórfica:
 Tipo estático: Figura ClaseDerivada Se ejecutará el código de miMetodo
 Tipo dinámico: Rectángulo definido en ClaseDerivada.
+miMetodo()
()
37 38

Jerarquía de Clases: Figuras Ejemplo de Polimorfismo: Enlace Dinámico

public class TestPolimorfismo {


Object public static void main (String args[]) {
Figura f = new Circulo();
System.out.println(“Radio del Circulo: “ + f.radio());
}
Figura

cannot resolve symbol - method radio

Rectángulo Circulo  El compilador únicamente considera el tipo estático de la variable


ppara comprobar
p el acceso:
+radio()
 El método radio no está definido en la clase Figura. Error en
Cuadrado tiempo de compilación.
 Aunque
A ell tipo
ti dinámico
di á i de d f sea Circulo.
Ci l
39 40
Ejemplo de Polimorfismo: Conversión de Ejemplo de Polimorfismo: Conversión de
Restricción (I) Ampliación
public class TestPolimorfismo { public class TestPolimorfismo {
public static void main (String args[]) { public static void main (String args[]) {
Figura f = new Circulo(); Figura f = new Circulo();
y p (
System.out.println(“Radio del Circulo: “ + ( (Circulo)
( ) f ).radio());
) ()) y p ()
System.out.print(f);
} }
}

 Ya que f es de tipo dinámico Circulo, podemos realizar un  System.out.println invocará al método toString de f, que
casting
g a tipo
p Circulo y, p
posteriormente,, invocar el originalmente
g está definido en la clase Object
j aunque
q ha
método radio. sido sobrescrito en la clase Figura (y luego en Circulo).
 El operador casting () permite transformar una referencia de Se produce una conversión de ampliación.
un tipo
i a otro equivalente.
i l
 El enlace dinámico garantiza que se ejecutará el
 Si el tipo destino NO es equivalente (i.e. ((Cuadrado) f) ),
entonces se produce la excepción ClassCastException. correspondiente método de la clase Circulo.
41 42

Ejemplo de Polimorfismo: Conversión de Comprobación de Tipo Dinámico: Operador


Restricción (II) instanceof
 Mostrar por pantalla sólo aquellos elementos que son de tipo
public class TestPolimorfismo { Circulo,
C cu o, además
a e ás dee cuántos
cuá tos hay
ay (se asume
asu e que hay
ay un
u vecto
vector
public static void main (String args[]) { de Figuras ya inicializado correctamente):
Figura f = new Circulo();
Circulo c = f; ppublic class TestPolimorfismo {
} Figura coleccion[];
} public static void main (String args[]) {
System.out.println("Cuántos Círculos hay en la colección?");
int numCirculos = 0;
 Aunque el tipo dinámico de f sea Circulo, al realizar la última for(int i=0; i<coleccion.length; i++) {
asignación, el compilador indica que “incompatible types - Figura f = coleccion[i];
f
found Figura but expected Circulo”.
C ” if (f instanceof
i t f Circulo)
Ci l ) {
System.out.print( f.toString());
 El compilador únicamente tiene en cuenta los tipos estáticos para numCirculos++;
comprobar
b que las
l asignaciones
i i son correctas.
t }
}
 La asignación se debería realizar de la siguiente manera: System.out.println(“Hay “ + numCirculos + “ circulos.”);
}
 Ci l c = (Ci
Circulo (Circulo)
l ) ff;
43 44
Ejercicio de Herencia y Polimorfismo Restringiendo la Especialización: Final
 Dada la jerarquía de herencia,  Empleando la palabra clave final
¿Qué instrucciones son  Los atributos, métodos y las clases pueden ser declaradas
SerVivo correctas y cuales no? como finales.
+vive()
()  Atributo final: Representa una constante cuyo valor no puede ser
1. SerVivo sv = new Humano(); modificado.
 Método final: Impide que el método sea sobreescrito en alguna clase
Animal Vegetal
g 2. Humano hu = new Humano(); descendiente.
3. Vegetal vg = new GiraSol();  Clase final: No pueden tener subclases, representa una hoja dentro
4. sv.razona(); del árbol de jerarquía de herencia.
Humano GiraSol  El uso de final genera código más eficiente ya que no se
5. sv.vive();
+razona() utiliza enlace dinámico y la llamada se resuelve en tiempo de
+vive() 6. hu.razona(); compilación.
Vi
seresVivos 7
7. hu = vg;
8. sv = vg;

45 46

Clases Abstractas (I) Clases Abstractas (II)


 ¿Cómo obligar a que todas las clases derivadas deban public class Rectangulo extends Figura {
f
forzosamente implementar
i l un ddeterminado
i d método?
é d ? ...
 Empleando la palabra clave abstract public double area(){ return base * altura;}
...
public
bli abstract
b t t classl Fi
Figura {
}
protected String tipo;
protected Color color; public class Cuadrado extends Rectangulo {
public Figura(String nombre){....} ...
public abstract double area(); //No hace falta redefinir el método area
... ...
} }
public class Circulo extends Figura {
 La clase Cuadrado hereda la implementación del método area de la
...
clase Rectángulo. No es necesario cambiar la implementación y, por
public double area(){ return Math.PI * radio * radio;}
lo tanto, no hace falta redefinir el método.
...
}
47 48
Clases Abstractas (III) Clase Abstracta: La clase Figura (I)
 Una clase abstracta … package lasFiguras;
 Tiene al menos un método abstracto, etiquetado como tal. import java.awt.*; //Para poder referenciar la clase Color
 Debe ser etiquetada por el programador como abstracta. public abstract class Figura { // extends Object
 N puede
No d ser instanciada
i t i d (vía
( í ell operador
d new). ) protected String tipo;
 Su(s) constructor(es) pueden ser utilizados (vía super) protected String color;
 Puede ser utilizada p
para definir referencias ppolimórficas de la clase. protected static final String TIPO_POR_DEFECTO = "Circulo";
protected static final Color COLOR_POR_DEFECTO = Color.black;
 Una subclase de una clase abstracta puede:
 Implementar todos los métodos abstractas  Puede ser instanciada
public Figura(Color c, c String t){
 No implementar los métodos abstractos  Sigue siendo abstracta
this.tipo = t; this.color = c;
 Utilización de estas clases: }
 C d se quiere
Cuando i obligar
bli a que llas subclases
b l ttengan un cierto
i t public Figura(){
comportamiento
this(TIPO_POR_DEFECTO, COLOR_POR_DEFECTO);
 Ejemplo
j p estándar de Clase abstracta: Number }

49 50

Clase Abstracta: La clase Figura (II) La Clase Rectangulo


… public class Rectangulo extends Figura {
public boolean equals(Object x){ protected double base;
Figura f = (Figura) x; protected double altura;
return (color.equals(f.color)
(color equals(f color) && tipo.equals(f.tipo));
tipo equals(f tipo));
}
public Rectangulo(Color c, double b, double a){
public abstract double area(); super(c,
( “R“Rectángulo”);
tá l ”) this.base
thi b = b;
b this.altura
thi lt = a;
¿Para qué sirven los constructores
de una clase abstracta si no se }
} //Fin de la clase Figura puede instanciar? public Rectangulo (){
this(Color.black, 10.0, 10);
}
public double area(){ return base * altura;}
...
}
51 52
Interfaces en Java Interfaces en Java: Características
 En ocasiones es necesario que una clase herede de más de una  Una Interfaz …
superclase:  Consta sólo de perfiles de métodos que indican qué hace la clase
(especificación) pero sin implementación.
 Herencia Múltiple
 Permite especificar un comportamiento genérico.
 Java sólo permite que una clase herede explícitamente, vía
extends, de una única superclase (distinta de Object).
 Para poder imponer el comportamiento que describe:
 Sus métodos son públicos y abstractos, por lo que han de ser
 En ocasiones es necesario imponer a una clase una forzosamente implementados por sus subclases. Se dice que una
funcionalidad genérica que no posee Object. clase implementa un interfaz.
 Sus atributos son p
públicos y finales,, ppor lo qque NO tiene
constructores ni puede ser instanciada, PERO sí se pueden definir
 Para ello, se debe definir una superclase especial, sólo con variables Referencia (polimórficas) del interfaz.
métodos abstractos,
abstractos por lo que forzosamente todas sus
subclases los deben implementar si quieren dejar de ser  Una subclase puede implementar todas las interfaces que
abstractas. quiera.

53 54

Interfaces en Java: Sintaxis y Utilización Ejemplo de Interfaces (I)


 Sintaxis de Interfaces:  Ejemplo
j p de uso de interfaces:
 Uso de la palabra clave interface en lugar de class.
 Se asume que los métodos son public y abstract.  Forzar a que las clases proporcionen una descripción de ellas.
public interface MiInterfaz { public interface Describible {
p
int metodoQueImplementar(Object o); String getDescripcion();
}
}
 En las subClases del interfaz, se añade a su cabecera implements public class Libro implements Describible {
...
ppublic Stringg g
getDescripcion(){
p (){
public
bli class
l MiClase
MiCl i
implements
l t MiInterfaz
MiI t f { return “Este objeto es un libro”;
... }
public int metodoQueImplementar(Object o){ ...
/* Implementacion del método */ ¿Qué ocurriría si MiClase }
} implementa el interfaz pero no • Si se añaden nuevos métodos al interfaz,, deberán ser implementados
p en
} proporciona código al método? las correspondientes clases.
55 56
Ejemplo de Interfaces (II) Extensión de Interfaces
 Una clase JJava puede
p implementar
p varias interfaces.  Una Interfaz A p
puede extender de otra interfaz B.
public interface Estudioso { public interface Trabajador {  Implementar la interfaz A requiere dar código a todos los
Conocimiento estudia(Conceptos c); Dinero trabaja(Tareas t); métodos de A (los de A y los heredados de B).
} }
public interface OrdenadorPortable extends Ordenador{
public class EstudianteTrabajador implements Estudioso,Trabajador{ float capacidadBateria();
public Conocimiento estudia(Conceptos c){ }
//Implementación
} public interface Ordenador{
public Dinero trabaja(Tareas t){ voidd encender();
d ()
//Implementación }
} public
bli class
l PDA implements
i l O d
OrdenadorPortable{
d P t bl {
} float capacidadBateria() { … }
• Es pposible que
q tener referencias de tipo
p interfaz que
q sean polimórficas,
p , i.e.: void encender(){ … }
Estudioso e = new EstudianteTrabajador(); }
57 58

Uso Alternativo de Interfaces


 Una interfaz también suele ser utilizada para agrupar
constantes.
public interface DiasSemana
{
int LUNES = 1 , MARTES = 2;
String [] NOMBRE
NOMBRE_DIAS
DIAS = { "Lunes"
Lunes , "Martes"};
Martes };
}

public
bli class
l MisDias
Mi Di implements
i l Di S
DiasSemana
{
public int metodo(){
p (){
System.out.println(NOMBRE_DIAS[LUNES]);
}
}
59

S-ar putea să vă placă și