Java - Interfaces
Una interfaz es un tipo de referencia en Java. Es similar a la clase. Es una colección de métodos abstractos. Una clase implementa una interfaz, por lo que hereda los métodos abstractos de la interfaz.
Junto con los métodos abstractos, una interfaz también puede contener constantes, métodos predeterminados, métodos estáticos y tipos anidados. Los cuerpos de métodos existen solo para métodos predeterminados y métodos estáticos.
Escribir una interfaz es similar a escribir una clase. Pero una clase describe los atributos y comportamientos de un objeto. Y una interfaz contiene comportamientos que implementa una clase.
A menos que la clase que implementa la interfaz sea abstracta, todos los métodos de la interfaz deben definirse en la clase.
Una interfaz es similar a una clase de las siguientes maneras −
-
Una interfaz puede contener cualquier cantidad de métodos.
-
Una interfaz se escribe en un archivo con un .java extensión, con el nombre de la interfaz que coincide con el nombre del archivo.
-
El código de bytes de una interfaz aparece en un .class archivo.
-
Las interfaces aparecen en los paquetes y su archivo de código de bytes correspondiente debe estar en una estructura de directorio que coincida con el nombre del paquete.
Sin embargo, una interfaz es diferente de una clase en varias formas, incluyendo −
-
No puede instanciar una interfaz.
-
Una interfaz no contiene constructores.
-
Todos los métodos en una interfaz son abstractos.
-
Una interfaz no puede contener campos de instancia. Los únicos campos que pueden aparecer en una interfaz deben declararse tanto estáticos como finales.
-
Una interfaz no es extendida por una clase; es implementado por una clase.
-
Una interfaz puede extender múltiples interfaces.
Declaración de interfaces
La interfaz La palabra clave se utiliza para declarar una interfaz. Aquí hay un ejemplo simple para declarar una interfaz −
Ejemplo
El siguiente es un ejemplo de una interfaz −
/* File name : NameOfInterface.java */ import java.lang.*; // Any number of import statements public interface NameOfInterface { // Any number of final, static fields // Any number of abstract method declarations\ }
Las interfaces tienen las siguientes propiedades −
-
Una interfaz es implícitamente abstracta. No es necesario utilizar el resumen palabra clave al declarar una interfaz.
-
Cada método en una interfaz también es implícitamente abstracto, por lo que no se necesita la palabra clave abstract.
-
Los métodos en una interfaz son implícitamente públicos.
Ejemplo
/* File name : Animal.java */ interface Animal { public void eat(); public void travel(); }
Implementación de interfaces
Cuando una clase implementa una interfaz, puede pensar en la clase como firmando un contrato, acordando realizar los comportamientos específicos de la interfaz. Si una clase no realiza todos los comportamientos de la interfaz, la clase debe declararse como abstracta.
Una clase utiliza los implementos palabra clave para implementar una interfaz. La palabra clave implements aparece en la declaración de clase después de la parte extendida de la declaración.
Ejemplo
/* File name : MammalInt.java */ public class MammalInt implements Animal { public void eat() { System.out.println("Mammal eats"); } public void travel() { System.out.println("Mammal travels"); } public int noOfLegs() { return 0; } public static void main(String args[]) { MammalInt m = new MammalInt(); m.eat(); m.travel(); } }
Esto producirá el siguiente resultado −
Salida
Mammal eats Mammal travels
Al anular los métodos definidos en las interfaces, hay varias reglas a seguir −
-
Las excepciones marcadas no deben declararse en métodos de implementación que no sean los declarados por el método de interfaz o subclases de los declarados por el método de interfaz.
-
Se debe mantener la firma del método de interfaz y el mismo tipo o subtipo de retorno al anular los métodos.
-
Una clase de implementación en sí misma puede ser abstracta y, de ser así, no es necesario implementar métodos de interfaz.
Cuando la implementación interactúa, hay varias reglas −
-
Una clase puede implementar más de una interfaz a la vez.
-
Una clase puede extender solo una clase, pero implementar muchas interfaces.
-
Una interfaz puede extender otra interfaz, de forma similar a como una clase puede extender otra clase.
Extensión de interfaces
Una interfaz puede extender otra interfaz de la misma manera que una clase puede extender otra clase. Las extensiones La palabra clave se utiliza para ampliar una interfaz y la interfaz secundaria hereda los métodos de la interfaz principal.
La siguiente interfaz de deportes se amplía con las interfaces de hockey y fútbol.
Ejemplo
// Filename: Sports.java public interface Sports { public void setHomeTeam(String name); public void setVisitingTeam(String name); } // Filename: Football.java public interface Football extends Sports { public void homeTeamScored(int points); public void visitingTeamScored(int points); public void endOfQuarter(int quarter); } // Filename: Hockey.java public interface Hockey extends Sports { public void homeGoalScored(); public void visitingGoalScored(); public void endOfPeriod(int period); public void overtimePeriod(int ot); }
La interfaz de Hockey tiene cuatro métodos, pero hereda dos de Deportes; por lo tanto, una clase que implemente Hockey necesita implementar los seis métodos. De manera similar, una clase que implemente Football necesita definir los tres métodos de Football y los dos métodos de Sports.
Extensión de múltiples interfaces
Una clase Java solo puede extender una clase principal. No se permite la herencia múltiple. Sin embargo, las interfaces no son clases y una interfaz puede extender más de una interfaz principal.
La palabra clave extends se usa una vez y las interfaces principales se declaran en una lista separada por comas.
Por ejemplo, si la interfaz de Hockey se extendiera tanto a Deportes como a Eventos, se declararía como −
Ejemplo
public interface Hockey extends Sports, Event
Interfases de etiquetado
El uso más común de las interfaces extendidas ocurre cuando la interfaz principal no contiene ningún método. Por ejemplo, la interfaz MouseListener en el paquete java.awt.event extendió java.util.EventListener, que se define como −
Ejemplo
package java.util; public interface EventListener {}
Una interfaz sin métodos se denomina etiquetado interfaz. Hay dos propósitos básicos de diseño de las interfaces de etiquetado:
Crea un padre común − Al igual que con la interfaz EventListener, que se amplía con docenas de otras interfaces en la API de Java, puede usar una interfaz de etiquetado para crear un padre común entre un grupo de interfaces. Por ejemplo, cuando una interfaz amplía EventListener, la JVM sabe que esta interfaz en particular se utilizará en un escenario de delegación de eventos.
Agrega un tipo de datos a una clase − De esta situación es de donde proviene el término etiquetar. Una clase que implementa una interfaz de etiquetado no necesita definir ningún método (ya que la interfaz no tiene ninguno), pero la clase se convierte en un tipo de interfaz a través del polimorfismo.
Java