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
Formadeve ter o métododouble area(). - As classes
RetanguloeCirculodevem implementarFormausandoimplements. - 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
- Declaramos a interface
Formacom um único método abstratodouble area(). Isso define o contrato que todas as formas devem seguir. - A classe
RetanguloimplementaFormae guardalarguraealturacomo atributosfinal. O construtor inicializa esses valores. - O método
area()emRetanguloretornalargura * altura, cumprindo o contrato. - A classe
Circulotambém implementaForma, mas calcula a área comoMath.PI * raio * raio. - No
main, criamos variáveis do tipoFormae atribuímos instâncias deRetanguloeCirculo. Isso é polimorfismo: o tipo da variável é a interface. - Chamamos
area()em cada objeto; o método executado é o da classe concreta, graças ao despacho dinâmico. - Usamos
printfcom%.2fpara 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 comoabstract. - Usar
extendsem vez deimplementspara a interface:class Retangulo extends Formagera erro de compilação, poisFormaé uma interface. Useimplements. - Declarar o método com visibilidade mais restrita:
double area()sempublicna classe que implementa a interface não compila, pois a implementação não pode reduzir a visibilidade. Sempre usepublic.
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