Tema 12:
Interfaces y Clases
internas
0
Modificador abstract
z Indica que debe ampliarse un
método (sólo está indicado el
comportamiento) o que una clase
derivada (llamada también subclase)
debe proporcionar la
implementación.
Mónica E. García García Feb ‘07 1
Clase abstracta
z Con una clase de este tipo se tiene la
posibilidad de declarar clases que
definen como se utiliza solamente, sin
tener que implementar métodos.
z Las subclases de una clase abstracta
deben sobreescribir todos los métodos
abstractos.
z Las subclases de una clase abstracta
deben ser declaradas como clases
abstractas.
z Una clase abstracta puede incluir
miembros no abstractos.
z No se puede instanciar una clase
abstracta pero sí crear referencias de
ella.
Mónica E. García García Feb ‘07 2
Clase abstracta
z Si se desea que una clase no sea abstracta
entonces basta con que el cuerpo del
método(s) abstract sea vacío.
z Ejemplos:
public abstract class ClasePadre1{
public double metodo1(){
//acciones
}
public abstract metodo2();
}
public class ClasePadre2{
public double metodo1(){
//acciones
}
public abstract metodo2(){ }
}
Mónica E. García García Feb ‘07 3
Método abstracto
z Un método es abstracto si no tiene
implementación.
public abstract metodo();
z Todas las clases que heredan de la
clase abstracta tiene la “obligación”
de implementar el método abstracto
(hacerlo concreto).
z No es válido constructores ni
métodos static abstract.
Mónica E. García García Feb ‘07 4
Interfaz
z Definición
Es un tipo de clase que sólo denota
comportamiento. La keyword utilizada
es interface.
z Características:
z Permite simular la herencia múltiple.
z La interfaz sólo es public o default.
z Todos sus métodos son public abstract.
z Todos los atributos son public static
final.
Mónica E. García García Feb ‘07 5
Características
z Ejemplo:
interface UnEjemplo {
int CONSTANTE = 100;
int metodoAbstracto( int parametro );
}
z Cuando una clase va a utilizar los
miembros de una interfaz se usa la
keyword implements.
z La interfaz no es instanciable.
Mónica E. García García Feb ‘07 6
Características
z Si una clase no implementa todos
los métodos de la interfaz debe ser
declarada como abstracta.
class ClaseUno implements UnEjemplo {
int multiplicando=CONSTANTE;
int metodoAbstracto( int parametro ){
return ( parametro * multiplicando );
}
}
z Las constantes definidas en una interfaz
pueden usarse en otra clase , uanque no
implementen la interfaz, de la siguiente
manera: [Link];
int r= 3.25 * [Link];
Mónica E. García García Feb ‘07 7
Interfaz
z ¿Cuándo usar una interfaz?
Cuando se trate de manipular similitudes
entre clases no relacionadas sin forzar una
relación entre ellas.
Cuando se sabe que se quiere hacer
pero no como (aún o porque lo hará otro
usuario).
z Ejemplo:
Humano Actor Canino
actua()
Persona Perro
... ...
actua() actua()
... ...
Mónica E. García García Feb ‘07 8
Interfaz
z Una interfaz puede heredar de
muchas clases.
z Una clase puede implementar
muchas interfaces
public claseUno implements inter1,inter2,inter3{
//sentencias
}
Mónica E. García García Feb ‘07 9
Ejemplo 1 Interfaz
interface Act {
void act();
}
class Actor1 implements Act {
public void act() {
[Link]("To be, or not to be");
}
}
class Actor2 implements Act {
public void act() {
[Link]("Wherefore art thou Romeo?"
);
}
}
public class TryOut {
public static void main(String args[]) {
Actor1 hamlet = new Actor1();
Actor2 juliet = new Actor2();
tryout(hamlet);
tryout(juliet);
}
private static void tryout(Act actor) {
[Link]();
}
}
Mónica E. García García Feb ‘07 10
Ejemplo 2 Interfaz
interface Monster {
void menace();
}
interface DangerousMonster extends Monster {
void destroy();
}
interface Lethal {
void kill();
}
class DragonZilla implements DangerousMonste{
public void menace() { }
public void destroy() { }
}
interface Vampire extends DangerousMonster,
Lethal {
void drinkBlood();
}
Mónica E. García García Feb ‘07 11
Ejemplo 2b Interfaz
class VeryBadVampire implements Vampire {
public void menace() { }
public void destroy() { }
public void kill() { }
public void drinkBlood() { }
}
public class HorrorShow {
static void u(Monster b) {
[Link]();
}
static void v(DangerousMonster d) {
[Link]();
[Link]();
}
static void w(Lethal l) {
[Link]();
}
Mónica E. García García Feb ‘07 12
Ejemplo 3c Interfaz
public static void main(String[] args) {
DangerousMonster barney = new DragonZilla(
);
u(barney);
v(barney);
Vampire vlad = new VeryBadVampire();
u(vlad);
v(vlad);
w(vlad);
}
}
Mónica E. García García Feb ‘07 13
Diferencias
entre clase, clase
abstracta e interfaz
Tipo class abstract interface
Herencias
Instanciable
implementa
atributos
Mónica E. García García Feb ‘07 14
Clases internas
z Clase interna
3 De manera general es una clase
como cualquier otra. Se declara de la
misma forma que las demás pero
dentro de otra clase, específicamente
dentro del bloque de código
especificado por las llaves.
3 En el código las clases internas
proporcionan beneficios de
organización, pero también tienen la
habilidad de acceder a miembros de
las clases externas.
3 Generalmente son usadas en el
modelado de eventos de Java.
Mónica E. García García Feb ‘07 15
Tipos de
clases internas
z Al compilar una clase con clases
internas se generan varios .class
El nombre tendría la forma:
ClaseExterna$[Link]
z Existen 4 tipos:
9 Clases internas static
9 Clases internas miembro
9 Clases internas locales
9 Clases anónimas
Mónica E. García García Feb ‘07 16
Clases internas static
z Sólo pueden ser creadas dentro del bloque
de definición de la clase externa o dentro
de una interfaz.
z La invocación es [Link]
z Pueden usar los miembros static de la
clase externa.
z No se necesitan objetos de la clase externa
para poder crear objetos de la clase
interna static.
z La keyword import puede usarse para
importar una clase interna static.
Ejemplo:
... implements [Link]{ ...}
import List.*; // o
import [Link];
Mónica E. García García Feb ‘07 17
Clases internas
miembro
z Son llamadas nested class o simplemente
clases internas.
z No se pueden llamar igual que la clase
externa.
z No pueden contener miembros de tipo
static.
z Cada objeto de la clase interna existe
siempre dentro de un objeto de la clase
externa implícitamente.
z Las clases internas pueden ser private o
protected además de public y default.
z Los métodos de la clase interna acceden
directamente a todos los miembros de la
clase externa y viceversa.
z Una clase miembro puede contener otra
clase.
Mónica E. García García Feb ‘07 18
Clases internas
miembro
z En la clase interna la palabra this se refiere
al objeto de la propia clase, para accesar al
objeto de la clase externa se usa la
siguiente sintaxis:
[Link]
z Ejemplo:
C es una clase interna de B, que a su vez
es una clase interna de A.
// se crea un objeto
A a=new A(); // de la clase A
A.B b= [Link] B(); // de B dentro del objeto a
A.B.C c= [Link] C(); // de C dentro del objeto B
Mónica E. García García Feb ‘07 19
Clases internas
locales
z Son declaradas dentro de un método o en
un bloque estático.
z Su comportamiento es análogo a las
variables locales. Sólo son visibles dentro
del bloque de código donde fueron
definidas.
z Tienen acceso a todas las variables
miembro y métodos de la clase externa así
como a los miembros heredados.
z Pueden usar las variables locales y
argumentos de métodos visibles en ese
bloque de código sólo si son final.
z La keyword this se usa igual que en las
clases internas miembro pero no new ni
super.
z No pueden definir variables, métodos o
clases static.
z No usan ningún modificador de acceso.
Mónica E. García García Feb ‘07 20
Clases internas
anónimas
z No llevan nombre.
z La definición de la clase y la creación se
hacen en un mismo paso.
z No definen constructores pero si bloques
estáticos.
z Formas de definición:
3 new seguida de la definición de la clase entre
llaves {...}
3 new seguida del nombre de la clase de la que
hereda (no extends) y la definición de la clase
anónima entre llaves.
3 new seguida del nombre la interface que
implementa (no implements) y la definición de la
clase anónima entre llaves
z El compilador produce archivos de la forma:
Claseexterna$[Link]
z Ejemplo (de awt)
[Link](new ActionListener() {
public void actionPerformed(ActionEvent e) { ...}
} );
Mónica E. García García Feb ‘07 21
Ejemplo 1
public class Robot {
private int x;
private DescripcionRobot descripcion;
public Robot (int x) {
this.x=x;
[Link]=new DescripcionRobot();
}
// clase interna
public class DescripcionRobot {
private String nombre, color;
public DescripcionRobot() {
if (x>0) {
[Link]="A";
[Link]="blanco";
} else {
[Link]=”B";
[Link]=”rojo";
}
}
}
Mónica E. García García Feb ‘07 22
...Ejemplo 1
public void avanzar (int d) {
this.x+=d;
}
public int valorX () {
return this.x;
}
public void asignarX (int x) {
this.x=x;
}
public String toString() {
return "Robot(" + this.x + ")";
}
}
z La clase anidada puede ser “static” (clase
[Link])
z Las clase anidada tiene acceso a los miembros de
la clase que la contiene
z Las instancias se crean, por ejemplo:
[Link] r =
(new Robot(3)).new DescripcionRobot()
Mónica E. García García Feb ‘07 23
Ejemplo 2
public class Parcel1 {
class Contents {
private int i = 11;
public int value() {
return i;
}
}
class Destination {
private String label;
Destination(String whereTo) {
label = whereTo;
}
String readLabel() {
return label;
}
}
public void ship(String dest) {
Contents c = new Contents();
Destination d = new Destination(dest);
[Link]([Link]());
}
public static void main(String[] args) {
Parcel1 p = new Parcel1();
[Link]("Tanzania");
}
} 24
Ejemplo 3
public class Parcel2 { // Retorno de una referencia
class Contents { // a una clase interna
private int i = 11;
public int value() { return i; }
}
class Destination {
private String label;
Destination(String whereTo) { label = whereTo; }
String readLabel() {
return label; } }
public Destinationto(String s) {
return new Destination(s); }
public Contents cont() {
return new Contents(); }
public void ship(String dest) {
Contents c = cont();
Destination d = to(dest);
[Link]([Link]() ) ; }
public static void main(String[] args) {
Parcel2 p = new Parcel2();
[Link]("Tanzania");
Parcel2 q = new Parcel2();
// Definiendo una referencia a una clase interna
[Link] c = [Link]();
[Link] d = [Link]("Borneo"); }
} 25
Ejemplo 4
//Herencia de una clase interna
class WithInner {
class Inner {
}
}
public class InheritInner extends [Link]
{
//! InheritInner() {} // No se puede compilar
InheritInner(WithInner wi) {
[Link]();
}
public static void main(String[] args) {
WithInner wi = new WithInner();
InheritInner ii = new InheritInner(wi);
}
}
Mónica E. García García Feb ‘07 26
Ejemplo 5
//Creación de un constructor para una clase anónima
abstract class Base {
public Base(int i) {
[Link]("Base constructor, i = " + i);
}
public abstract void f();
}
public class AnonymousConstructor {
public static Base getBase(int i) {
return new Base(i) {
{
[Link](“Dentro de la inicialización de
instancia");
}
public void f() {
[Link](“En metodo f() anonimo");
}
};
}
public static void main(String[] args) {
Base base = getBase(47);
base.f();
}
}
Mónica E. García García Feb ‘07 27
Ejemplo 6
//Una clase anónima
//Devuelve un tipo enumerado sobre la pila mediante
una clase anónima.
public Enumeration elementos( ){
return new Enumeration( ){
int cont= cima;
public boolean hashMoreElements(){
return cont >0;
}
public Object nextElement(){
if (cont ==0)
throw new NoSuchElementException(“Pila
en array”);
return array[--cont] ;
}
};
}
Mónica E. García García Feb ’07 28