Recapitulação - Calculadora de Formas
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 33 de 87.
Desafio
FácilVamos construir uma calculadora de formas que reúne todos os conceitos de polimorfismo que você aprendeu neste capítulo. Você criará uma classe abstrata Shape com subclasses concretas e, em seguida, usará o polimorfismo para calcular e exibir as áreas de maneira uniforme.
Você organizará seu código em quatro arquivos:
Shape.java: Crie uma classe abstrata que sirva como base para todas as formas. Cada forma possui um camponame(String). Inclua um construtor para inicializá-lo, um método gettergetName()e um método abstratogetArea()que retorna um double. Adicione também um métododescribe()que retorna:[name]: [area](onde a área é formatada para 2 casas decimais usandoString.format("%.2f", getArea())).Circle.java: Crie uma classe concreta que estenda Shape. Círculos têm um camporadius(double). Usesuperpara passar "Circle" como o nome. ImplementegetArea()para retornar a área usandoMath.PI * radius * radius.Rectangle.java: Crie outra classe concreta que estenda Shape. Retângulos têm camposwidtheheight(ambos double). Passe "Rectangle" como o nome para o construtor pai. ImplementegetArea()para retornar a largura multiplicada pela altura.Main.java: Construa uma calculadora de formas que demonstre o polimorfismo em ação. Você receberá três entradas: um raio para o círculo, uma largura e uma altura para o retângulo.Crie um Circle e um Rectangle, depois armazene-os em um array de referências
Shape. Percorra o array e, para cada forma, imprima sua descrição usando o métododescribe().Após o loop, calcule e imprima a área total de todas as formas com o formato:
Total area: [sum](também formatado para 2 casas decimais). Use um loop separado ou um acumulador para somar as áreas chamandogetArea()em cada referência de forma.
Você receberá três entradas: o raio do círculo (double), a largura do retângulo (double) e a altura do retângulo (double).
Sua saída deve mostrar três linhas - uma descrição para cada forma seguida pela área total. Observe como você pode tratar diferentes formas uniformemente através do tipo abstrato Shape, enquanto cada forma calcula sua área de sua própria maneira!
Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Ler as entradas
double radius = scanner.nextDouble();
double width = scanner.nextDouble();
double height = scanner.nextDouble();
// TODO: Criar um objeto Circle usando o radius
// TODO: Criar um objeto Rectangle usando width e height
// TODO: Criar um array de referências Shape e armazenar ambas as formas nele
// TODO: Percorrer o array e imprimir a descrição de cada forma usando describe()
// TODO: Calcular a área total de todas as formas
// Use um loop ou acumulador para somar as áreas chamando getArea() em cada forma
// TODO: Imprimir a área total com o formato: "Total area: [sum]"
// Use String.format("%.2f", totalArea) para formatação
}
}
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