+ All Categories
Home > Documents > Clase Interfaces

Clase Interfaces

Date post: 25-Sep-2015
Category:
Upload: franciisco-gonzalez-gomez
View: 220 times
Download: 0 times
Share this document with a friend
Description:
Programacion Orientada a Objetos
Popular Tags:
29
Interfaces Pensando en Java
Transcript

Interfaces y Clase Internas

InterfacesPensando en JavaIntroduccinClase 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. InterfacesElementos de una interfaz Se proporciona la forma sin implementacin de mtodos:Nombres de mtodos,Listas de parmetrosTipos de retornoOpcionalmente: campos que son implcitamente estticos y constantesinterface Instrumento { int i = 5; // esttico y constante

// No puede tener def. de mtodos // Automticamente pblicos

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

}

implements: cmo funcionainterface: qu contieneextends: clase obtenida por extensinClases implementadas y extendidasclase ordinaria que puede extenderse

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 ( ) ; afinarTodo (orquesta) ; } } Orquesta 0

1

2

3

4

nullnullnullnullnullpublic 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 implicita hacia arriba orquesta [i++] = new Viento(); orquesta [i++] = new Percusion ( ) ; orquesta [i++] = new Cuerda() ;' orquesta [i++] = new Metal(); orquesta [i++] = new Maderaviento ( ) ; afinarTodo (orquesta) ; } } Referencia al objeto Viento0

1

2

3

4

Orquesta Viento -+Orquesta 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 ( ) ; afinarTodo (orquesta) ; } } Referencia al objeto Viento0

1

2

3

4

Orquesta Referencia al objeto PercusinReferencia al objeto CuerdaReferencia al objeto MetalRef. al objeto Maderavientopublic 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 ( ) ; afinarTodo (orquesta) ; } } Referencia al objeto Viento0

1

2

3

4

Orquesta Referencia al objeto PercusinReferencia al objeto CuerdaReferencia al objeto MetalRef. al objeto Maderavientopublic 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 ( ) ; afinarTodo (orquesta) ; } } Referencia al objeto Viento0

1

2

3

4

Orquesta Referencia al objeto PercusinReferencia al objeto CuerdaReferencia al objeto MetalRef. 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 ( ) ; afinarTodo (orquesta) ; } } Referencia al objeto Viento0

1

2

3

4

Orquesta Referencia al objeto PercusinReferencia al objeto CuerdaReferencia al objeto MetalRef. al objeto MaderavientoViento. Tocar()Percusion.tocar()Cuerda.tocar( )Metal. tocar ( ) Maderaviento.tocar()Herencia mltipleSi se hereda desde una no-interfaz, slo se puede heredar de una.Herencia mltipleEl ejemplo siguiente muestra una clase concreta combinada con varias interfaces para producir una nueva clase

Herencia mltipleimport java-util.* ;public interface PuedeLuchar { void luchar ( ) ; }

public interface PuedeNadar { void nadar ( ) ; }

public interface PuedeVolar { void volar ( ) ; }

class PersonajeDeAccion {public void luchar ( ) { }}

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

PuedeLucharPuedeNadarPuedeVolarPersonajeDeAccionHeroespublic class Aventura {

static void t (PuedeLuchar x) { x. luchar ( ) ; } static void u (PuedeNadar x) { x.nadar ( ) ; } static void v(PuedeVolar x) { x.volar ( ) ; } static void 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 }}

PuedeLucharPuedeNadarPuedeVolarPersonajeDeAccionHeroeInterfaz vs clase abstractadebera 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 mtodosinterface 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} 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 ( ) { }}f() in cap8_Colision.C5 cannot override f() in cap8_Colision.C

return type void is not compatible with int

Colisiones de nombres de mtodosinterface 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} 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 { }types cap8_Colision.I3 and cap8_Colision.I1 are incompatible; both define f(), but with unrelated return types

Colisiones de nombres de mtodosinterface 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} 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 { } / / / : -ColisionInterfaces . java: 23 : f ( ) in C cannotimplement f ( ) in 11; attempting to useincompatible return typef ound : intrequired: voidColisionInterfaces.java:24: interfaces I3 and I1 areincompatible; both define f( ) , but with different return type

cap8_Colision.C5 is not abstract and does not override abstract method f() in cap8_Colision.I1Extensin de una interfaz con herenciainterface Monstruo { void amenaza ( ) ;}

interface MonstruoPeligroso extends Monstruo { void destruir ( ) ; }

interface Letal { void matar ( ) ;}

class Dragon implements MonstruoPeligroso { public void amenaza ( ) { } public void destruir ( ) { }}

interface Vampiro extends MonstruoPeligroso { Letal { void beberSangre ( ) ;}

class EspectaculoDeMiedo {

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

static void v (MonstruoPeligroso d) { d.amenaza ; d.destruir ( ) ;}

public static void main (String[] args) { Dragon if2 = new Dragon(); u (if2) ; v (if2) ; }}Constantes de AgrupamientoCualquier 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 Agrupamientopackage 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 pblicosNombres en mayscula, separando palabras con guion bajoUso de constantes conc08.* c08.Meses Inicializando atributospublic interface ValoresAleatorios { int rint = (int) (Math.random() * 10) ; long rlong = (long) (Math. random ( ) * 10);}-----------------------------------------------------------public class PruebaValoresAleatorios {

public static void main (String[] args) { System.out.println(ValoresAleatorios.rint); System.out.println(ValoresAleatorios.rlong); }}Los atributos definidos en las interfaces son automticamente estticos y constantesLos atributos pueden inicializarse con expresiones no constantes.


Recommended