Menu

Interfaces em Java: definindo contratos e implements

O que é uma interface em Java, como defini-la e implementá-la, os métodos default e static, e como as interfaces diferem das classes abstratas.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

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 Bird e um Airplane podem ambos ser Flyable. Uma classe pode implementar muitas. Sem estado de instância.
  • Classe abstrata - estado e código compartilhados entre classes intimamente relacionadas. Um Cat e um Dog ambos estendem Animal, 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.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR