Dominada as Classes Abstratas, vamos dar um passo adiante com as Interfaces. Elas são um conceito fundamental na Programação Orientada a Objetos, especialmente em Java, e nos permitem definir "contratos" de comportamento que as classes devem seguir, garantindo um design de software ainda mais flexível e desacoplado.
Imagine que você está em um restaurante. O menu é como um contrato. Ele diz o que o restaurante (a classe) pode "fazer" (os métodos) para você, como "servir prato principal", "servir sobremesa", "fazer a conta". O menu não diz como o chef vai preparar o prato ou como a conta será calculada, apenas que essas ações estão disponíveis.
Uma Interface em Java é exatamente isso: um contrato 100% abstrato. Ela define um conjunto de métodos abstratos que uma classe deve implementar. Ao contrário de uma classe abstrata, uma interface não pode ter nenhuma implementação de método (até o Java 8, onde métodos default e static foram introduzidos, mas vamos focar no conceito fundamental primeiro). Ela apenas declara "o quê" uma classe deve fazer, mas nunca "como" ela deve fazer.
public static final), nem construtores e, tradicionalmente, não possuem métodos concretos. Elas são puramente sobre comportamento.Motivos:
Carro e um Avião são veículos, mas também podem ser MeioTransporte.Uma interface pode conter:
public abstract): São os métodos que a classe que implementa a interface deve fornecer uma implementação. Por padrão, todos os métodos em uma interface são public e abstract, mesmo que você não declare explicitamente.public static final): Você pode definir constantes em uma interface. Elas são automaticamente public, static e final.Vamos pensar em animais. Alguns podem voar, outros não. Um Pato e um Avião (mesmo não sendo um animal, mas pensando em classes) podem ter o comportamento de "voar". Pinguim não voa. A capacidade de voar é um comportamento que pode ser aplicado a diferentes tipos de objetos, e é um caso perfeito para uma interface.
// Declaração de uma Interface
public interface Voador { // Note a palavra-chave 'interface'
// Método abstrato: Define o comportamento de voar
// É implicitamente public abstract void voar();
void voar();
// Outro método abstrato: Define a altura máxima de voo
double getAlturaMaximaVoo();
// Exemplo de constante em uma interface
String TIPO_VOO = "Atmosférico"; // Implicitamente public static final String TIPO_VOO = "Atmosférico";
}
Neste exemplo:
Voador é uma interface (marcada com interface).voar() e getAlturaMaximaVoo(). Qualquer classe que implemente Voador será obrigada a fornecer uma implementação para esses dois métodos.TIPO_VOO.