Fácil Java

Implementando uma interface simples

Enunciado

Crie uma interface Forma com o método double area(). Depois, crie as classes Retangulo e Circulo que implementam Forma. No main, instancie cada uma e imprima a área formatada com duas casas decimais.

Requisitos

  • A interface Forma deve ter o método double area().
  • As classes Retangulo e Circulo devem implementar Forma usando implements.
  • O programa deve imprimir a área de cada forma com duas casas decimais.

Código inicial

interface Forma {
    double area();
}

// TODO: implemente Retangulo e Circulo

public class Main {
    public static void main(String[] args) {
        // TODO: crie instâncias e imprima as áreas
    }
}

Saída esperada

Area do retangulo: 12,00
Area do circulo: 28,27
Ver dica

Use Math.PI para o círculo e System.out.printf("%.2f%n", valor) para formatar. Lembre-se de que o separador decimal pode variar com o locale; use Locale.US se necessário.

Mostrar solução
interface Forma {
    double area(); // contrato: toda forma deve saber calcular sua área
}

class Retangulo implements Forma {
    private final double largura;
    private final double altura;

    Retangulo(double largura, double altura) {
        this.largura = largura;
        this.altura = altura;
    }

    @Override
    public double area() {
        return largura * altura;
    }
}

class Circulo implements Forma {
    private final double raio;

    Circulo(double raio) {
        this.raio = raio;
    }

    @Override
    public double area() {
        return Math.PI * raio * raio;
    }
}

public class Main {
    public static void main(String[] args) {
        Forma retangulo = new Retangulo(4, 3);
        Forma circulo = new Circulo(3);

        // Usa Locale.US para garantir ponto como separador decimal
        System.out.printf("Area do retangulo: %.2f%n", retangulo.area());
        System.out.printf("Area do circulo: %.2f%n", circulo.area());
    }
}

Passo a passo

  1. Declaramos a interface Forma com um único método abstrato double area(). Isso define o contrato que todas as formas devem seguir.
  2. A classe Retangulo implementa Forma e guarda largura e altura como atributos final. O construtor inicializa esses valores.
  3. O método area() em Retangulo retorna largura * altura, cumprindo o contrato.
  4. A classe Circulo também implementa Forma, mas calcula a área como Math.PI * raio * raio.
  5. No main, criamos variáveis do tipo Forma e atribuímos instâncias de Retangulo e Circulo. Isso é polimorfismo: o tipo da variável é a interface.
  6. Chamamos area() em cada objeto; o método executado é o da classe concreta, graças ao despacho dinâmico.
  7. Usamos printf com %.2f para formatar a saída com duas casas decimais.

Por que funciona

A interface Forma estabelece um tipo comum para classes que não têm relação de herança entre si. Ao programar contra a interface, o código cliente não precisa saber se a forma é um retângulo ou círculo; ele só chama area(). Isso é o princípio da inversão de dependência e permite adicionar novas formas sem alterar o código existente.

Erros comuns

  • Esquecer de implementar area() na classe concreta: o compilador acusa erro “Retangulo is not abstract and does not override abstract method area()”. Solução: implementar o método ou declarar a classe como abstract.
  • Usar extends em vez de implements para a interface: class Retangulo extends Forma gera erro de compilação, pois Forma é uma interface. Use implements.
  • Declarar o método com visibilidade mais restrita: double area() sem public na classe que implementa a interface não compila, pois a implementação não pode reduzir a visibilidade. Sempre use public.

Outra forma de resolver

Poderia usar uma classe abstrata Forma com um campo comum, mas como não há estado compartilhado, a interface é mais flexível. Exemplo:

abstract class FormaAbstrata {
    abstract double area();
}

Prefira interface quando quiser apenas definir um contrato sem impor hierarquia de classes.

Saída esperada

Area do retangulo: 12,00
Area do circulo: 28,27