Menu
Coddy logo textTech

Implementando Interfaces

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 35 de 87.

Para usar uma interface, uma classe deve implementá-la usando a palavra-chave implements. A classe então fornece implementações concretas para todos os métodos declarados na interface:

public interface Drawable {
    void draw();
}

public class Circle implements Drawable {
    private double radius;
    
    public Circle(double radius) {
        this.radius = radius;
    }
    
    @Override
    public void draw() {
        System.out.println("Drawing a circle with radius " + radius);
    }
}

Se uma classe implementa uma interface, mas não fornece implementações para todos os seus métodos, o compilador lançará um erro. A anotação @Override é opcional, mas recomendada, pois ajuda a detectar erros.

Assim como acontece com as classes abstratas, você pode usar uma interface como um tipo de referência. Isso permite o polimorfismo, onde diferentes classes que implementam a mesma interface podem ser tratadas de forma uniforme:

Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);

shape1.draw();  // Desenhando um círculo com raio 5.0
shape2.draw();  // Desenhando um retângulo 4.0 x 3.0

Isso é poderoso porque o código que trabalha com referências Drawable não precisa conhecer o tipo de classe específico. Ele apenas se importa que o objeto possa ser desenhado.

Na próxima aula, você verá como uma única classe pode implementar múltiplas interfaces simultaneamente.

challenge icon

Desafio

Fácil

Vamos construir um sistema de alto-falantes que demonstra como as classes implementam interfaces. Você criará uma interface que define o que qualquer alto-falante pode fazer e, em seguida, construirá dois tipos diferentes de alto-falantes que implementam esse contrato à sua maneira.

Você organizará seu código em quatro arquivos:

  • Speaker.java: Defina uma interface chamada Speaker que declara o que qualquer alto-falante deve ser capaz de fazer. Todo alto-falante deve ter um método speak() que retorna uma String—este é o contrato que todas as classes implementadoras devem cumprir.
  • Human.java: Crie uma classe que implemente a interface Speaker. Um Human possui um campo name (String). Inclua um construtor para inicializar o nome e implemente o método speak() para retornar: [name] says: Hello everyone!
  • Robot.java: Crie outra classe que implemente a interface Speaker. Um Robot possui um campo model (String). Inclua um construtor para inicializar o modelo e implemente o método speak() para retornar: Robot [model] says: Beep boop!
  • Main.java: Reúna tudo usando polimorfismo baseado em interface. Você receberá duas entradas: um nome humano e um modelo de robô. Crie um Human e um Robot, depois armazene-os em um array de referências Speaker. Percorra o array e imprima o resultado da chamada de speak() em cada alto-falante.

Você receberá duas entradas: o nome do humano (String) e o modelo do robô (String).

Sua saída deve mostrar duas linhas—uma para cada alto-falante. Observe como tanto o Human quanto o Robot podem ser tratados de forma uniforme através da interface Speaker, mesmo que falem de maneiras completamente diferentes!

Folha de consulta

Uma classe usa a palavra-chave implements para implementar uma interface e deve fornecer implementações concretas para todos os métodos declarados na interface:

public interface Drawable {
    void draw();
}

public class Circle implements Drawable {
    private double radius;
    
    public Circle(double radius) {
        this.radius = radius;
    }
    
    @Override
    public void draw() {
        System.out.println("Drawing a circle with radius " + radius);
    }
}

A anotação @Override é opcional, mas recomendada, pois ajuda a capturar erros.

Interfaces podem ser usadas como tipos de referência, permitindo o polimorfismo, onde diferentes classes que implementam a mesma interface podem ser tratadas de forma uniforme:

Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);

shape1.draw();  // Desenhando um círculo com raio 5.0
shape2.draw();  // Desenhando um retângulo 4.0 x 3.0

Experimente você mesmo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Ler entradas
        String humanName = scanner.nextLine();
        String robotModel = scanner.nextLine();
        
        // TODO: Criar um objeto Human com o nome fornecido
        
        // TODO: Criar um objeto Robot com o modelo fornecido
        
        // TODO: Criar um array de referências Speaker contendo ambos os objetos
        
        // TODO: Percorrer o array e imprimir o resultado de speak() para cada speaker
    }
}
quiz iconTeste seus conhecimentos

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