Java - Interfaces
Uma interface é um tipo de referência em Java. É semelhante à classe. É 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 qualquer número de métodos.
-
Uma interface é escrita em um arquivo com um .java extensão, com o nome da interface correspondente ao nome do arquivo.
-
O código de byte de uma interface aparece em um .class Arquivo.
-
As interfaces aparecem em pacotes e seu arquivo de 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 como estáticos e finais.
-
Uma interface não é estendida por uma classe; é implementado por uma classe.
-
Uma interface pode estender várias interfaces.
Declarando interfaces
A interface palavra-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 o resumo 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(); }
Implementação de interfaces
Quando uma classe implementa uma interface, você pode pensar na classe como assinando um contrato, concordando em realizar os comportamentos específicos da interface. Se uma classe não executa todos os comportamentos da interface, a classe deve se declarar como abstrata.
Uma classe usa os implementos palavra-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 -
Saída
Mammal eats Mammal travels
Ao substituir métodos definidos em interfaces, existem várias regras a serem seguidas -
-
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 ou subtipo de retorno 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.
Extensão de interfaces
Uma interface pode estender outra interface da mesma forma que uma classe pode estender outra classe. O estende A palavra-chave é usada para estender uma interface e a interface filha herda os métodos da interface pai.
A interface Sports a seguir é estendida pelas interfaces Hockey e Football.
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; assim, uma classe que implementa Hockey precisa implementar todos os seis métodos. Da mesma forma, uma classe que implementa Football precisa definir os três métodos de Football e os dois métodos de Sports.
Estendendo várias interfaces
Uma classe Java só pode estender uma classe pai. A herança múltipla não é permitida. 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 Hockey estendesse tanto Sports quanto Event, ela seria declarada como −
Exemplo
public interface Hockey extends Sports, Event
Interfaces de marcação
O uso mais comum de estender interfaces ocorre quando a interface pai não contém nenhum método. Por exemplo, a interface MouseListener no pacote java.awt.event estendeu java.util.EventListener, que é definido como −
Exemplo
package java.util; public interface EventListener {}
Uma interface sem métodos é chamada de marcação interface. Existem dois propósitos básicos de design de interfaces de marcação -
Cria um pai comum − Assim como 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 eventos.
Adiciona um tipo de dados a uma classe − Esta situação é a origem do termo etiquetagem. Uma classe que implementa uma interface de marcação não precisa definir nenhum método (já que a interface não possui nenhum), mas a classe se torna um tipo de interface por meio de polimorfismo.
Java