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, heredando así 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étodo 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 formas:

  • Una interfaz puede contener varios métodos.

  • Una interfaz se escribe en un archivo con un .java extensión, con el nombre de la interfaz que coincida con el nombre del archivo.

  • El código de bytes de una interfaz aparece en un .class archivo.

  • Las interfaces aparecen en 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 varios aspectos, que incluyen:

  • No puede crear una instancia de una interfaz.

  • Una interfaz no contiene ningún constructor.

  • Todos los métodos de 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 se extiende por una clase; es implementado por una clase.

  • Una interfaz puede extender múltiples interfaces.

Declaración de interfaces

los interfaceLa palabra clave se utiliza para declarar una interfaz. Aquí hay un ejemplo simple para declarar una interfaz:

Ejemplo

A continuación se muestra 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 elabstract palabra clave al declarar una interfaz.

  • Cada método en una interfaz también es implícitamente abstracto, por lo que la palabra clave abstracta no es necesaria.

  • Los métodos de 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 si estuviera firmando un contrato, aceptando 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 usa el implementspalabra clave para implementar una interfaz. La palabra clave implements aparece en la declaración de clase que sigue a la parte de extensión 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 métodos definidos en interfaces, se deben seguir varias reglas:

  • 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.

  • La firma del método de interfaz y el mismo tipo o subtipo de retorno deben mantenerse al anular los métodos.

  • Una clase de implementación en sí puede ser abstracta y, de ser así, no es necesario implementar métodos de interfaz.

Cuando se implementan interfaces, 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 manera similar a como una clase puede extender otra clase.

Ampliación de interfaces

Una interfaz puede extender otra interfaz de la misma manera que una clase puede extender otra clase. losextends La palabra clave se usa para extender una interfaz, y la interfaz secundaria hereda los métodos de la interfaz principal.

La siguiente interfaz de deportes se amplía con 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 Sports; por lo tanto, una clase que implementa 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.

Ampliació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 extiende se usa una vez y las interfaces principales se declaran en una lista separada por comas.

Por ejemplo, si la interfaz de Hockey extendiera tanto Deportes como Eventos, se declararía como:

Ejemplo

public interface Hockey extends Sports, Event

Interfaces de etiquetado

El uso más común de extender interfaces 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 en ella se denomina tagginginterfaz. Hay dos propósitos básicos de diseño de las interfaces de etiquetado:

Creates a common parent- Al igual que con la interfaz EventListener, que se amplía con docenas de otras interfaces en la API de Java, puede utilizar una interfaz de etiquetado para crear un padre común entre un grupo de interfaces. Por ejemplo, cuando una interfaz extiende EventListener, la JVM sabe que esta interfaz en particular se utilizará en un escenario de delegación de eventos.

Adds a data type to a class- Esta situación es de donde proviene el término etiquetado. 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.