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); } } |
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").