Полиморфное поведение
Используйте полиморфизм для вывода, сортировки и обобщения смешанных фигур. Делайте алгоритмы небольшими и понятными для мобильного обучения.
«Полиморфное поведение» — бесплатный урок Java Academy на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 3 уроков всего.
Обзор
Полиморфное поведение позволяет работать со всеми фигурами одинаково, хотя каждая выполняет собственные математические вычисления. Мы: (1) единообразно выведем смешанный список, (2) отсортируем его по area и (3) вычислим итоговые значения одним циклом.
Проверка базового программного интерфейса
Базовый программный интерфейс содержит действия, используемые повсюду:
- area() и perimeter() — должны быть реализованы каждой фигурой.
- Небольшой необязательный вспомогательный метод, например label() или info(), для аккуратного вывода.
- Храните поля внутри конкретных фигур.
Код: единообразный вывод
Единообразный вывод: цикл использует только программный интерфейс Shape. Каждый объект выполняет собственную реализацию математических вычислений.
public class Main {
static abstract class Shape {
abstract double area();
abstract double perimeter();
String label() { return getClass().getSimpleName(); }
String info() { return String.format("area=%.2f, per=%.2f", area(), perimeter()); }
}
static class Circle extends Shape {
double r; Circle(double r) { this.r = (r < 0) ? 0 : r; }
double area() { return Math.PI * r * r; }
double perimeter() { return 2 * Math.PI * r; }
}
static class Rectangle extends Shape {
double w, h; Rectangle(double w, double h) { this.w = Math.max(0, w); this.h = Math.max(0, h); }
double area() { return w * h; }
double perimeter() { return 2 * (w + h); }
}
public static void main(String[] args) {
Shape[] list = { new Circle(2.0), new Rectangle(3.0, 4.0), new Circle(1.0) };
for (int i = 0; i < list.length; i = i + 1) {
Shape s = list[i];
System.out.println(s.label() + " -> " + s.info());
}
}
}
Идея сортировки по area
Идея сортировки:
- Сравнение: сопоставьте значения area() двух фигур.
- Для небольших данных достаточно простой пузырьковой сортировки или сортировки выбором.
- Используйте только методы Shape; проверки типа не нужны.
Код: сортировка по area
Простая сортировка: требуется только вызов area(). Проверки типа нет; в этом и заключается сила полиморфизма.
public class Main {
static abstract class Shape { abstract double area(); abstract double perimeter(); String label(){ return getClass().getSimpleName(); } }
static class Circle extends Shape { double r; Circle(double r){ this.r = Math.max(0, r);} double area(){return Math.PI*r*r;} double perimeter(){return 2*Math.PI*r;} }
static class Rectangle extends Shape { double w,h; Rectangle(double w,double h){ this.w=Math.max(0,w); this.h=Math.max(0,h);} double area(){return w*h;} double perimeter(){return 2*(w+h);} }
// Very small bubble sort for beginners (ascending by area)
static void sortByArea(Shape[] arr){
for(int pass=0; pass<arr.length-1; pass=pass+1){
for(int i=0; i<arr.length-1; i=i+1){
if(arr[i].area() > arr[i+1].area()){
Shape tmp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = tmp;
}
}
}
}
public static void main(String[] args) {
Shape[] a = { new Rectangle(3,4), new Circle(2), new Circle(1) };
sortByArea(a);
for(int i=0;i<a.length;i=i+1){
System.out.println(a[i].label() + " area=" + String.format("%.2f", a[i].area()));
}
}
}
Код: подсчёт area
Подсчёт итога: в одном цикле суммируются вызовы area(). Каждый элемент выполняет собственный расчёт, поэтому наш код остаётся простым.
public class Main {
static abstract class Shape { abstract double area(); abstract double perimeter(); }
static class Circle extends Shape { double r; Circle(double r){ this.r=Math.max(0,r);} double area(){return Math.PI*r*r;} double perimeter(){return 2*Math.PI*r;} }
static class Rectangle extends Shape { double w,h; Rectangle(double w,double h){ this.w=Math.max(0,w); this.h=Math.max(0,h);} double area(){return w*h;} double perimeter(){return 2*(w+h);} }
static double totalArea(Shape[] arr){
double sum = 0.0;
for(int i=0;i<arr.length;i=i+1){
sum = sum + arr[i].area(); // polymorphic call
}
return sum;
}
public static void main(String[] args) {
Shape[] list = { new Circle(1), new Rectangle(2,3), new Circle(0.5) };
System.out.println("Total area = " + String.format("%.2f", totalArea(list)));
}
}
Проверка стиля полиморфизма
Быстрая проверка: какой стиль кода лучше всего использует здесь полиморфизм?
Итоги
Итоги: мы писали код с помощью одного и того же программного интерфейса, а каждая фигура создавала собственный результат. Вывод, сортировка и подсчёт суммы работали с единообразным кодом.
Часто задаваемые вопросы
Урок «Полиморфное поведение» бесплатный?
Да — полный текст урока «Полиморфное поведение» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 3 уроков всего.
Чему я научусь в уроке «Полиморфное поведение»?
Используйте полиморфизм для вывода, сортировки и обобщения смешанных фигур. Делайте алгоритмы небольшими и понятными для мобильного обучения. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.
Сколько времени занимает урок «Полиморфное поведение»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Проектирование
- Реализация
- Полиморфное поведение