Introdução às Interfaces
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 34 de 87.
Você viu como classes abstratas definem contratos que as subclasses devem seguir. Mas e se você quiser que uma classe siga múltiplos contratos? O Java não permite que uma classe estenda múltiplas classes, mas resolve esse problema com interfaces.
Uma interface é um contrato que define o que uma classe pode fazer, sem especificar como ela faz isso. Ao contrário das classes abstratas, as interfaces contêm apenas assinaturas de métodos (por padrão) sem implementação:
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}Pense em uma interface como uma promessa. Quando uma classe implementa uma interface, ela promete fornecer implementações para todos os métodos declarados nessa interface. A interface define a capacidade, e a classe fornece o comportamento.
Interfaces são declaradas usando a palavra-chave interface em vez de class. Todos os métodos em uma interface são implicitamente public e abstract, então você não precisa escrever essas palavras-chave:
public interface Playable {
void play(); // implicitamente public abstract
void pause();
void stop();
}Interfaces também podem declarar constantes, que são implicitamente public static final:
public interface GameConstants {
int MAX_PLAYERS = 4; // implicitamente public static final
}Na próxima lição, você aprenderá como as classes implementam interfaces usando a palavra-chave implements.
Desafio
FácilVamos construir um sistema de controle de dispositivos definindo interfaces que descrevem o que diferentes dispositivos podem fazer. Este desafio foca na criação de interfaces — os contratos que definem capacidades sem especificar como elas funcionam.
Você organizará seu código em três arquivos:
Switchable.java: Crie uma interface que defina o que significa para um dispositivo ser comutável (switchable). Qualquer dispositivo comutável deve ser capaz de ligar e desligar. Declare dois métodos:turnOn()eturnOff(). Lembre-se, os métodos de interface são implicitamente públicos e abstratos, então você só precisa das assinaturas dos métodos.Adjustable.java: Crie outra interface que defina o que significa para um dispositivo ser ajustável. Um dispositivo ajustável deve ser capaz de definir seu nível. Declare um métodosetLevel(int level). Também inclua uma constanteMAX_LEVELcom o valor100— lembre-se que as constantes em interfaces são implicitamentepublic static final.Main.java: Demonstre que suas interfaces estão devidamente definidas imprimindo informações sobre elas. Você receberá uma entrada: um valor de nível (int). Imprima as três linhas a seguir:Switchable methods: turnOn, turnOffAdjustable methods: setLevelMax level constant: [MAX_LEVEL value](acesse a constante a partir da interface Adjustable)
Setting level to: [input level]
Você receberá uma entrada: um valor de nível (int).
Este desafio foca puramente na definição de interfaces — os projetos que descrevem capacidades. Na próxima lição, você aprenderá como as classes realmente implementam essas interfaces para fornecer o comportamento real!
Folha de consulta
Uma interface é um contrato que define o que uma classe pode fazer, sem especificar como ela faz. Interfaces contêm apenas assinaturas de métodos sem implementação.
Interfaces são declaradas usando a palavra-chave interface:
public interface Drawable {
void draw();
}Todos os métodos em uma interface são implicitamente public e abstract:
public interface Playable {
void play(); // implicitamente public abstract
void pause();
void stop();
}Interfaces podem declarar constantes, que são implicitamente public static final:
public interface GameConstants {
int MAX_PLAYERS = 4; // implicitamente public static final
}Uma classe pode implementar múltiplas interfaces, ao contrário de estender múltiplas classes.
Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int level = scanner.nextInt();
// TODO: Imprima informações sobre as interfaces
// Imprima: "Switchable methods: turnOn, turnOff"
// Imprima: "Adjustable methods: setLevel"
// Imprima: "Max level constant: " seguido por Adjustable.MAX_LEVEL
// Imprima: "Setting level to: " seguido pelo nível de entrada
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Iterator