Полиморфизм времени выполнения в Java: примеры и пояснения

Полиморфизм времени выполнения в Java означает способность объекта принимать множество форм и вести себя по-разному в зависимости от его фактического типа во время выполнения. Эта концепция достигается за счет переопределения и наследования методов. Вот несколько методов, демонстрирующих полиморфизм времени выполнения в Java:

  1. Переопределение метода:

    class Animal {
       public void makeSound() {
           System.out.println("Animal is making a sound");
       }
    }
    class Dog extends Animal {
       @Override
       public void makeSound() {
           System.out.println("Dog is barking");
       }
    }
    public class Main {
       public static void main(String[] args) {
           Animal animal = new Dog(); // Upcasting
           animal.makeSound(); // Dog is barking
       }
    }
  2. Вызов полиморфного метода:

    class Shape {
       public void draw() {
           System.out.println("Drawing a shape");
       }
    }
    class Circle extends Shape {
       @Override
       public void draw() {
           System.out.println("Drawing a circle");
       }
    }
    class Square extends Shape {
       @Override
       public void draw() {
           System.out.println("Drawing a square");
       }
    }
    public class Main {
       public static void main(String[] args) {
           Shape[] shapes = new Shape[2];
           shapes[0] = new Circle();
           shapes[1] = new Square();
           for (Shape shape : shapes) {
               shape.draw(); // Polymorphic method invocation
           }
       }
    }
  3. Перегрузка метода:

    class Calculator {
       public int add(int a, int b) {
           return a + b;
       }
       public double add(double a, double b) {
           return a + b;
       }
    }
    public class Main {
       public static void main(String[] args) {
           Calculator calculator = new Calculator();
           System.out.println(calculator.add(5, 10)); // 15
           System.out.println(calculator.add(3.2, 2.8)); // 6.0
       }
    }
  4. Абстрактные методы:

    abstract class Animal {
       public abstract void makeSound();
    }
    class Dog extends Animal {
       @Override
       public void makeSound() {
           System.out.println("Dog is barking");
       }
    }
    public class Main {
       public static void main(String[] args) {
           Animal animal = new Dog();
           animal.makeSound(); // Dog is barking
       }
    }