0Pricing
Java Academy · Урок

Полиморфное поведение

Используйте полиморфизм для вывода, сортировки и обобщения смешанных фигур. Делайте алгоритмы небольшими и понятными для мобильного обучения.

«Полиморфное поведение» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Проектирование
  2. Реализация
  3. Полиморфное поведение
← Назад к Java Academy