Uma interface é um contrato
Uma interface declara o que uma classe pode fazer sem dizer como. É uma lista de assinaturas de métodos que qualquer classe que a implemente promete cumprir. O ponto central é o desacoplamento: o código pode trabalhar com o tipo da interface sem se importar com qual classe concreta está por trás.
Circle implements Shape significa que Circle precisa definir area e perimeter. Quando o faz, um Circle é uma Shape e pode ser armazenado em uma variável do tipo Shape.
Muitas classes, um único tipo
O poder fica evidente quando várias classes sem relação entre si implementam a mesma interface. O código escrito contra Shape lida com todas elas:
O laço nunca pergunta "isto é um Circle ou um Rectangle?" - ele apenas chama area() e confia no contrato. Adicionar um Triangle mais tarde não exige nenhuma mudança aqui.
Implementando múltiplas interfaces
Uma classe estende apenas uma classe, mas pode implementar qualquer número de interfaces - é assim que Java realiza a "herança múltipla" de comportamento com segurança:
Liste as interfaces separadas por vírgula após implements. A classe precisa satisfazer todas elas.
Métodos default e static
Desde o Java 8, uma interface pode incluir corpos de método. Um método default dá às classes que a implementam uma implementação pronta que elas herdam de graça (e podem sobrescrever):
Métodos default permitem que uma interface evolua - adicionando um método sem quebrar todos os implementadores existentes. Um método de interface static, por outro lado, é um utilitário que você chama na própria interface, como Comparator.naturalOrder().
Constantes
Os campos de uma interface são implicitamente public static final - são constantes, não estado de instância:
interface Physics {
double GRAVITY = 9.81; // automatically public static final
}
As interfaces tradicionalmente não guardam estado por objeto; a ausência de campos de instância é parte do que as distingue das classes.
Interfaces funcionais
Uma interface com exatamente um método abstrato é uma interface funcional, e você pode implementá-la com uma expressão lambda em vez de uma classe inteira:
Esta é a base dos lambdas de Java e dos tipos de java.util.function (Function, Predicate, Supplier e companhia). A anotação @FunctionalInterface torna a intenção explícita e permite que o compilador imponha a regra de método único.
Interface versus classe abstrata
Ambas permitem programar contra uma abstração, então quando escolher cada uma?
- Interface - uma capacidade que classes sem relação entre si podem compartilhar. Um
Birde umAirplanepodem ambos serFlyable. Uma classe pode implementar muitas. Sem estado de instância. - Classe abstrata - estado e código compartilhados entre classes intimamente relacionadas. Um
Cate umDogambos estendemAnimal, herdando campos comuns e métodos parcialmente implementados. Uma classe estende apenas uma.
Um padrão comum combina as duas: uma interface define o contrato e uma classe abstrata implementa as partes repetitivas, de modo que as subclasses concretas preenchem apenas os detalhes específicos.
A seguir: classes abstratas
As interfaces definem comportamento sem estado. As classes abstratas ficam entre as interfaces e as classes completas - elas podem declarar métodos não implementados e carregar campos e construtores. Esse é o tema da próxima página.
Perguntas frequentes
O que é uma interface em Java?
Uma interface é um contrato: um conjunto de assinaturas de métodos (e constantes) que uma classe promete fornecer. Ela diz o que uma classe pode fazer, não como. Uma classe usa a palavra-chave implements para adotar uma interface e precisa fornecer um corpo para cada método abstrato que a interface declara. As interfaces permitem que classes sem relação entre si sejam usadas de forma intercambiável por meio de um tipo compartilhado.
Qual é a diferença entre uma interface e uma classe abstrata em Java?
Uma classe pode implementar muitas interfaces, mas estende apenas uma classe (abstrata). As interfaces tradicionalmente não guardam estado de instância e apenas declaram comportamento, enquanto uma classe abstrata pode ter campos, construtores e lógica parcialmente implementada. Use uma interface para definir uma capacidade que várias classes sem relação podem compartilhar; use uma classe abstrata para compartilhar estado e código comuns entre subclasses intimamente relacionadas.
Uma interface em Java pode ter corpos de método?
Sim, desde o Java 8. Métodos de interface marcados como default fornecem um corpo que as classes que a implementam herdam (e podem sobrescrever), e métodos de interface static oferecem um comportamento utilitário que pode ser chamado na própria interface. Métodos de interface comuns continuam abstratos -apenas uma assinatura- e as classes que a implementam precisam defini-los.