Java - Interfaces

Uma interface é um tipo de referência em Java. É semelhante à aula. É uma coleção de métodos abstratos. Uma classe implementa uma interface, herdando assim os métodos abstratos da interface.

Junto com métodos abstratos, uma interface também pode conter constantes, métodos padrão, métodos estáticos e tipos aninhados. Corpos de método existem apenas para métodos padrão e métodos estáticos.

Escrever uma interface é semelhante a escrever uma classe. Mas uma classe descreve os atributos e comportamentos de um objeto. E uma interface contém comportamentos que uma classe implementa.

A menos que a classe que implementa a interface seja abstrata, todos os métodos da interface precisam ser definidos na classe.

Uma interface é semelhante a uma classe das seguintes maneiras -

  • Uma interface pode conter vários métodos.

  • Uma interface é escrita em um arquivo com um .java extensão, com o nome da interface correspondendo ao nome do arquivo.

  • O código de byte de uma interface aparece em um .class Arquivo.

  • As interfaces aparecem nos pacotes, e seu arquivo bytecode correspondente deve estar em uma estrutura de diretório que corresponda ao nome do pacote.

No entanto, uma interface é diferente de uma classe de várias maneiras, incluindo -

  • Você não pode instanciar uma interface.

  • Uma interface não contém nenhum construtor.

  • Todos os métodos em uma interface são abstratos.

  • Uma interface não pode conter campos de instância. Os únicos campos que podem aparecer em uma interface devem ser declarados estáticos e finais.

  • Uma interface não é estendida por uma classe; é implementado por uma classe.

  • Uma interface pode estender várias interfaces.

Declaração de interfaces

o interfacepalavra-chave é usada para declarar uma interface. Aqui está um exemplo simples para declarar uma interface -

Exemplo

A seguir está um exemplo de uma interface -

/* 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\
}

As interfaces têm as seguintes propriedades -

  • Uma interface é implicitamente abstrata. Você não precisa usar oabstract palavra-chave ao declarar uma interface.

  • Cada método em uma interface também é implicitamente abstrato, portanto, a palavra-chave abstract não é necessária.

  • Os métodos em uma interface são implicitamente públicos.

Exemplo

/* File name : Animal.java */
interface Animal {
   public void eat();
   public void travel();
}

Implementando Interfaces

Quando uma classe implementa uma interface, você pode pensar na classe como a assinatura de um contrato, concordando em realizar os comportamentos específicos da interface. Se uma classe não executa todos os comportamentos da interface, ela deve se declarar abstrata.

Uma classe usa o implementspalavra-chave para implementar uma interface. A palavra-chave implements aparece na declaração de classe após a parte extends da declaração.

Exemplo

/* 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();
   }
}

Isso produzirá o seguinte resultado -

Resultado

Mammal eats
Mammal travels

Ao substituir métodos definidos em interfaces, existem várias regras a serem seguidas -

  • As exceções verificadas não devem ser declaradas em métodos de implementação diferentes daqueles declarados pelo método de interface ou subclasses daqueles declarados pelo método de interface.

  • A assinatura do método de interface e o mesmo tipo de retorno ou subtipo devem ser mantidos ao substituir os métodos.

  • Uma classe de implementação em si pode ser abstrata e, nesse caso, os métodos de interface não precisam ser implementados.

Quando interfaces de implementação, existem várias regras -

  • Uma classe pode implementar mais de uma interface por vez.

  • Uma classe pode estender apenas uma classe, mas implementar muitas interfaces.

  • Uma interface pode estender outra interface, da mesma forma que uma classe pode estender outra classe.

Estendendo Interfaces

Uma interface pode estender outra interface da mesma maneira que uma classe pode estender outra classe. oextends A palavra-chave é usada para estender uma interface, e a interface filha herda os métodos da interface pai.

A seguinte interface de esportes é estendida pelas interfaces de hóquei e futebol.

Exemplo

// 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);
}

A interface Hockey tem quatro métodos, mas herda dois de Sports; portanto, uma classe que implementa Hockey precisa implementar todos os seis métodos. Da mesma forma, uma classe que implementa Futebol precisa definir os três métodos de Futebol e os dois métodos de Esportes.

Estendendo Múltiplas Interfaces

Uma classe Java pode estender apenas uma classe pai. A herança múltipla não é permitida. As interfaces não são classes, entretanto, e uma interface pode estender mais de uma interface pai.

A palavra-chave extends é usada uma vez e as interfaces pai são declaradas em uma lista separada por vírgulas.

Por exemplo, se a interface do Hóquei estendesse esportes e eventos, seria declarada como -

Exemplo

public interface Hockey extends Sports, Event

Interfaces de marcação

O uso mais comum de extensões de interfaces ocorre quando a interface pai não contém nenhum método. Por exemplo, a interface MouseListener no pacote java.awt.event estendido java.util.EventListener, que é definido como -

Exemplo

package java.util;
public interface EventListener
{}

Uma interface sem métodos é chamada de tagginginterface. Existem dois objetivos básicos de design de interfaces de marcação -

Creates a common parent- Como acontece com a interface EventListener, que é estendida por dezenas de outras interfaces na API Java, você pode usar uma interface de marcação para criar um pai comum entre um grupo de interfaces. Por exemplo, quando uma interface estende EventListener, a JVM sabe que essa interface específica será usada em um cenário de delegação de evento.

Adds a data type to a class- É dessa situação que vem o termo marcação. Uma classe que implementa uma interface de marcação não precisa definir nenhum método (já que a interface não tem nenhum), mas a classe se torna um tipo de interface por meio de polimorfismo.