| En base a su ambiente, abra un Editor de Textos para generar el siguiente ejemplo. |
Código Fuente Musica3.java
import java.util.*;
interface Instrumento {
// Constante al compilar, automáticamente static y final
int i = 5;
// Métodos Automáticamente Públicos
void tocar();
String tipo();
void afinar();
}
class Guitarra implements Instrumento {
public void tocar() {
System.out.println("Guitarra.tocar()");
}
public String tipo() { return "Guitarra"; }
public void afinar() {}
}
class Piano implements Instrumento {
public void tocar() {
System.out.println("Piano.tocar()");
}
public String tipo() { return "Piano"; }
public void afinar() {}
}
class Saxofon implements Instrumento {
public void tocar() {
System.out.println("Saxofon.tocar()");
}
public String tipo() { return "Saxofon"; }
public void afinar() {}
}
// Un tipo de Guitarra
class Guzla extends Guitarra {
public void tocar() {
System.out.println("Guzla.tocar()");
}
public void afinar() {
System.out.println("Guzla.afinar()");
}
}
// Un tipo de Guitarra
class Ukelele extends Guitarra {
public void tocar() {
System.out.println("Ukelele.tocar()");
}
public String tipo() { return "Ukelele"; }
}
public class Musica3 {
// No importa el tipo de Instrumento,
// seguirá funcionando debido a Polimorfismo:
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) {
// Declarar un Arreglo SIN INSTANCIAS es válido en Clases Abstractas
Instrumento[] orquesta = new Instrumento[5];
int i = 0;
// Up-casting al asignarse el Arreglo
orquesta[i++] = new Guitarra();
orquesta[i++] = new Piano();
orquesta[i++] = new Saxofon();
orquesta[i++] = new Guzla();
orquesta[i++] = new Ukelele();
afinarTodo(orquesta);
}
}
|
Clase Musica3
La Clase anterior es idéntica aquella definida en los últimos dos ejemplos, sin embargo, la Clase Base de Instrumento fue definida como una interfase a través del vocablo interface, algunos detalles de esta definición :
Nótese que los métodos definidos dentro de la interfase no contienen ningún tipo de código dentro de ellos, inclusive no declaran ni llaves (
{ }).A diferencia de los métodos definidos en Clases Abstractas, los métodos definidos en Interfases no utilizan ningún calificador de acceso (
public, private, protected).Cuando una Clase hace uso de una Interfase esta utiliza la palabra
implements, además es necesario definir todos los métodos definidos en la Interfase dentro de la Clase.
En la siguiente sección se describe el uso de Interfases para Herencias Múltiples ("Multiple Inheritance").
