You are on page 1of 29

Interfaces

Pensando en Java

Introduccin
Clase abstracta
permite crear uno o ms mtodos sin definicin
dentro de una clase
se proporciona parte de la interfaz sin proporcionar
la implementacin correspondiente, que ser creada
por sus descendientes.

Interfaz
Produce una clase completamente abstracta,
que no tiene ningn tipo de implementacin.

Interfaces

Elementos de una interfaz


Se proporciona la
forma sin
implementacin de
mtodos:
Nombres de
mtodos,
Listas de parmetros
Tipos de retorno
Opcionalmente:
campos que son
implcitamente
estticos y constantes

interface Instrumento
{
int i = 5; // esttico y
constante
// No puede tener def. de
mtodos
// Automticamente pblicos

void tocar ( ) ;
String que ( ) ;
void ajustar ( ) ;
}

Clases implementadas y
extendidas
interface: qu contiene

implements: cmo
funciona
clase ordinaria que
puede extenderse

extends: clase
obtenida por
extensin

interface Instrumento
{
int i = 5;
void tocar ( ) ;
String que ( ) ;
void ajustar ( ) ;
}

class Viento implements Instrumento


{
public void tocar ( ) {
System. out .println ("Viento.
Tocar()" ) ;
}
public String que() { return
"Viento"; }
public void ajustar ( ) { }
}

class Percusion implements


Instrumento {
public void tocar ( ) {
System.out.println("Percusion.tocar()"
);
}
public String que() { return
"Percusion"; }
public void ajustar ( ) { }
}

class Cuerda implements Instrumento


{
public void tocar ( ) {
System. out .println ("Cuerda.
tocar ( ) " ) ;
}
public String que() { return
"Cuerda"; }
public void ajustar ( ) { }
}

class Maderaviento extends Viento {


public void tocar ( ) {
System.out.println("Maderaviento.tocar()"
);

}
public String que()
{ return "Maderaviento"; }
}

class Metal extends Viento {


public void tocar ( ) {
System.out .println ("Metal.
tocar ( ) " ) ;
}
public void ajustar ( ) {
System.out .println ("
Metal.ajustar( ) " ) ;
}
}

public class Musica5 {


static void afinar (Instrumento i)
{ i.tocar () ;}
static void afinarTodo (Instrumento [] e)
{
for(int i = 0; i < e.length; i++)
afinar (e [i] ) ;
}
public static void main (String[] args) {
Instrumento [] orquesta = new
Instrumento [5] ;
int i = 0;
// Haciendo conversin hacia arriba
orquesta [i++] = new Viento();
orquesta [i++] = new Percusion ( ) ;
orquesta [i++] = new Cuerda() ;'
orquesta [i++] = new Metal();
orquesta [i++] = new Maderaviento ( )

Orquesta
0

null

null

null

null

null

public class Musica5 {

Orquesta

static void afinar (Instrumento i)


{ i.tocar () ;}

0
Referencia
al objeto Viento

static void afinarTodo (Instrumento [] e)

for(int i = 0; i < e.length; i++)


afinar (e [i] ) ;

public static void main (String[] args) {


Orquesta

Instrumento [] orquesta = new


Instrumento [5] ;
int i = 0;
// Haciendo conversin implicita hacia
arriba
orquesta [i++] = new Viento();
orquesta [i++] = new Percusion ( ) ;
orquesta [i++] = new Cuerda() ;'
orquesta [i++] = new Metal();

+
-

Viento

public class Musica5 {


static void afinar (Instrumento i)
{ i.tocar () ;}
static void afinarTodo (Instrumento [] e)
{
for(int i = 0; i < e.length; i++)
afinar (e [i] ) ;
}
public static void main (String[] args) {
Instrumento [] orquesta = new
Instrumento [5] ;
int i = 0;
// Haciendo conversin hacia arriba
orquesta [i++] = new Viento();
orquesta [i++] = new Percusion ( ) ;
orquesta [i++] = new Cuerda() ;'
orquesta [i++] = new Metal();
orquesta [i++] = new Maderaviento ( )

Orquesta
0Referencia

al objeto Viento

1
Referencia
al objeto Percusin
2
Referencia

al objeto Cuerda

3 Referencia

al objeto Metal

4
Ref.
al objeto Maderaviento

public class Musica5 {


static void afinar (Instrumento i)
{ i.tocar () ;}
static void afinarTodo (Instrumento []
e) {
for(int i = 0; i < e.length; i++)
afinar (e [i] ) ;
}
public static void main (String[] args) {
Instrumento [] orquesta = new
Instrumento [5] ;
int i = 0;
// Haciendo conversin hacia arriba
orquesta [i++] = new Viento();
orquesta [i++] = new Percusion ( ) ;
orquesta [i++] = new Cuerda() ;'
orquesta [i++] = new Metal();
orquesta [i++] = new Maderaviento ( )

Orquesta
0Referencia

al objeto Viento

1
Referencia
al objeto Percusin
2
Referencia

al objeto Cuerda

3 Referencia

al objeto Metal

4
Ref.
al objeto Maderaviento

public class Musica5 {


static void afinar (Instrumento i)
{ i.tocar () ;}
static void afinarTodo (Instrumento []
e) {
for(int i = 0; i < e.length; i++)
afinar (e [i] ) ;
}
public static void main (String[] args) {
Instrumento [] orquesta = new
Instrumento [5] ;
int i = 0;
// Haciendo conversin hacia arriba
orquesta [i++] = new Viento();
orquesta [i++] = new Percusion ( ) ;
orquesta [i++] = new Cuerda() ;'
orquesta [i++] = new Metal();
orquesta [i++] = new Maderaviento ( )

Orquesta
0Referencia

al objeto Viento

1
Referencia
al objeto Percusin
2
Referencia

al objeto Cuerda

3 Referencia

al objeto Metal

4
Ref.
al objeto Maderaviento

public class Musica5 {


static void afinar (Instrumento i)
{ i.tocar () ;}
static void afinarTodo (Instrumento []
e) {
for(int i = 0; i < e.length; i++)
afinar (e [i] ) ;
}

Orquesta
0Referencia

al objeto Viento

1
Referencia
al objeto Percusin
2
Referencia

al objeto Cuerda

3 Referencia

al objeto Metal

4
Ref.
al objeto Maderaviento

public static void main (String[] args) {


Instrumento [] orquesta = new
Instrumento [5] ;
int i = 0;
// Haciendo conversin hacia arriba
orquesta [i++] = new Viento();
orquesta [i++] = new Percusion ( ) ;
orquesta [i++] = new Cuerda() ;'
orquesta [i++] = new Metal();
orquesta [i++] = new Maderaviento ( )

Viento. Tocar()
Percusion.tocar()
Cuerda.tocar( )
Metal. tocar ( )
Maderaviento.tocar()

Herencia mltiple
Si se hereda desde una no-interfaz,
slo se puede heredar de una.

Herencia mltiple
El ejemplo siguiente muestra una
clase concreta combinada con varias
interfaces para producir una nueva
clase

Herencia mltiple

import java-util.* ;
public interface PuedeLuchar
{ void luchar ( ) ; }
public interface PuedeNadar
{ void nadar ( ) ; }

PersonajeDeAcc
ion

PuedeLuch
ar
PuedeNada
r

public interface PuedeVolar


{ void volar ( ) ; }

PuedeVolar

class PersonajeDeAccion {
public void luchar ( ) { }
}
Heroes
class Heroe extends PersonajeDeAccion
implements PuedeLuchar, PuedeNadar, PuedeVolar { // primero la clase concreta, y
despus las interfaces
public void nadar () { }
public void volar () { }
}

PersonajeDeAcc
ion

PuedeLuch
ar
PuedeNada
r

PuedeVolar

Heroe

public class Aventura {


static
static
static
static

void
void
void
void

t (PuedeLuchar x) { x. luchar ( ) ; }
u (PuedeNadar x) { x.nadar ( ) ; }
v(PuedeVolar x) { x.volar ( ) ; }
w (PersonajeDeAccion x) { x. luchar ( ) ; }

public static void main (String[] args) {


Heroe h = new Heroe ( ) ;
//conversin hacia arriba
t( h ) ; // Tratarlo como un PuedeLuchar
u(h); // Tratarlo como un PuedeNadar
v(h); // Tratarlo como un PuedeVolar
w(h) ; // Tratarlo como un PersonajeDeAccion
}
}

Interfaz vs clase abstracta


debera usarse una interfaz o una
clase abstracta?
Una
interfaz
proporciona
los
beneficios de una clase abstracta y
los beneficios de una interfaz, por lo
que si es posible crear la clase base sin
definiciones de mtodos o variables
miembro, siempre se debera preferir
las interfaces a las clases abstractas.

Colisiones de nombres de
mtodos

interface I1 { void f ( ) ; }
interface I2 { int f (int i); }
interface I3 { int f ( ) ; }

class C { public int f ( ) { return 1; } }


class C2 implements I1, I2 {
public void f ( ) { }
f() in cap8_Colision.C5 cannot
public int f (int i) { return 1; } // sobrecargadooverride f() in cap8_Colision.C
}

return type void is not compatible


int

class C3 extends C implements I2 {


with
public int f (int i) { return 1; } // sobrecargado
}

class C4 extends C implements I3 {


public int f ( ) { return 1; } // Identica, sin problemas :
}

// El mtodo slo difiere en el tipo de


retorno:
class C5 extends C implements I1
{public void f ( ) { }}

Colisiones de nombres de
mtodos

interface I1 { void f ( ) ; }
interface I2 { int f (int i); }
interface I3 { int f ( ) ; }

class C { public int f ( ) { return 1; } }


class C2 implements I1, I2 {
types cap8_Colision.I3 and
public void f ( ) { }
cap8_Colision.I1 are incompatible;
public int f (int i) { return 1; } // sobrecargado
both define f(), but with unrelated
}

return types

class C3 extends C implements I2 {


public int f (int i) { return 1; } // sobrecargado
}
class C4 extends C implements I3 {
public int f ( ) { return 1; } // Identica, sin problemas :
}

// El mtodo slo difiere en el tipo de


retorno:
interface I4 extends I1, I3 { }

Colisiones de nombres de
ColisionInterfaces . java: 23 : f ( ) in C
mtodos
cannot

interface I1 { void f ( ) ; }
interface I2 { int f (int i); }
interface I3 { int f ( ) ; }

class C { public int f ( ) { return 1; } }


class C2 implements I1, I2 {
public void f ( ) { }
public int f (int i) { return 1; } // sobrecargado
}
class C3 extends C implements I2 {
public int f (int i) { return 1; } // sobrecargado
}

implement f ( ) in 11; attempting to use


incompatible return type
f ound : int
required: void
ColisionInterfaces.java:24: interfaces I3
and I1 are
incompatible; both define f
( ) , but with different return type

class C4 extends C implements I3 {


public int f ( ) { return 1; } // Identica, sin
problemas :
}
// Los mtodos slo difieren en el tipo de retorno:
/ / ! class C5 extends C implements I1 {public void f
( ) { }}
/ / ! interface I4 extends I1, I3 { } / / / : -

cap8_Colision.C5 is not abstract and


does not override abstract method f()
in cap8_Colision.I1

Extensin de una interfaz con


herencia
interface Monstruo {
void amenaza ( ) ;
}

class EspectaculoDeMiedo {
static void u (Monstruo b)
{ b. amenaza ( ) ; }

interface MonstruoPeligroso extends


Monstruo
{ void destruir ( ) ; }

static void v (MonstruoPeligroso d)


{ d.amenaza ; d.destruir ( ) ;}

interface Letal
{ void matar ( ) ;}
class Dragon implements
MonstruoPeligroso {
public void amenaza ( ) { }
public void destruir ( ) { }
}
interface Vampiro extends
MonstruoPeligroso {
Letal { void beberSangre ( ) ;}

public static void main (String[] args) {


Dragon if2 = new Dragon();
u (if2) ;
v (if2) ;
}
}

Constantes de
Agrupamiento
Cualquier campo que se ponga en
una interfaz se convierte
automticamente en:
esttico y constante
La interface es una herramienta
conveniente para la creacin de
grupos de valores constantes.

Constantes de
Agrupamiento
package c08;
public interface Meses {
int
ENERO = 1, FEBRERO = 2,
MARZO = 3,
ABRIL = 4, MAYO = 5, JUNIO =
6,
JULIO = 7, AGOSTO = 8,
SEPTIEMBRE = 9, OCTUBRE =
10,
NOVIEMBRE = 11, DICIEMBRE =
12;

Campos pblicos
Nombres en
mayscula,
separando
palabras con guion
bajo
Uso de constantes
con
c08.*
c08.Meses

Inicializando atributos
public interface ValoresAleatorios { Los atributos
int rint = (int) (Math.random() * 10)
definidos en las
;
interfaces son
long rlong = (long) (Math. random (
automticamente
) * 10);
estticos y
}
constantes
-------------------------------------------------- Los atributos
--------pueden
public class PruebaValoresAleatorios {

public static void main (String[] args) {


System.out.println(ValoresAleatorios.rint);
System.out.println(ValoresAleatorios.rlon
g);
}

inicializarse con
expresiones no
constantes.

You might also like