Итоги: Калькулятор фигур
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 33 из 87.
Задание
ЛегкоДавайте создадим калькулятор фигур, который объединит все концепции полиморфизма, изученные вами в этой главе. Вы создадите абстрактный класс Shape с конкретными подклассами, а затем используете полиморфизм для единообразного вычисления и отображения площадей.
Вы организуете свой код в четырех файлах:
Shape.java: Создайте абстрактный класс, который послужит основой для всех фигур. У каждой фигуры есть полеname(String). Включите конструктор для его инициализации, геттерgetName()и абстрактный методgetArea(), который возвращает double. Также добавьте методdescribe(), который возвращает:[name]: [area](где площадь отформатирована до 2 знаков после запятой с помощьюString.format("%.2f", getArea())).Circle.java: Создайте конкретный класс, расширяющий Shape. У кругов есть полеradius(double). Используйтеsuper, чтобы передать "Circle" в качестве имени. РеализуйтеgetArea()для возврата площади, используяMath.PI * radius * radius.Rectangle.java: Создайте еще один конкретный класс, расширяющий Shape. У прямоугольников есть поляwidthиheight(оба double). Передайте "Rectangle" в качестве имени в конструктор родителя. РеализуйтеgetArea()для возврата произведения ширины на высоту.Main.java: Создайте калькулятор фигур, демонстрирующий полиморфизм в действии. Вы получите три входных значения: радиус для круга, ширину и высоту для прямоугольника.Создайте Circle и Rectangle, затем сохраните их в массиве ссылок
Shape. Пройдите циклом по массиву и для каждой фигуры выведите ее описание, используя методdescribe().После цикла вычислите и выведите общую площадь всех фигур в формате:
Total area: [sum](также отформатированную до 2 знаков после запятой). Используйте отдельный цикл или аккумулятор для суммирования площадей, вызываяgetArea()для каждой ссылки на фигуру.
Вы получите три входных значения: радиус круга (double), ширину прямоугольника (double) и высоту прямоугольника (double).
Ваш вывод должен содержать три строки — по одному описанию для каждой фигуры, за которым следует общая площадь. Обратите внимание, как вы можете единообразно работать с различными фигурами через абстрактный тип Shape, в то время как каждая фигура вычисляет свою площадь по-своему!
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Чтение входных данных
double radius = scanner.nextDouble();
double width = scanner.nextDouble();
double height = scanner.nextDouble();
// TODO: Создайте объект Circle, используя radius
// TODO: Создайте объект Rectangle, используя width и height
// TODO: Создайте массив ссылок Shape и сохраните в нем обе фигуры
// TODO: Пройдитесь циклом по массиву и выведите описание каждой фигуры с помощью describe()
// TODO: Вычислите общую площадь всех фигур
// Используйте цикл или аккумулятор для суммирования площадей, вызывая getArea() для каждой фигуры
// TODO: Выведите общую площадь в формате: "Total area: [sum]"
// Используйте String.format("%.2f", totalArea) для форматирования
}
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»