English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Java

Java Управление потоком

Java Массивы

Java ООП (I)

Java ООП (II)

Java ООП (III)

Обработка исключений Java

Java Список (List)

Java Queue (очередь)

Java Map集合

Java Set集合

Java Вход/Выход (I/O)

Java Reader/Writer

Другие темы Java

Полиморфизм Java

В этом руководстве мы будем изучать полиморфизм через примеры, различные типы полиморфизма и как их реализовать в Java.

Полиморфизм - важное concepto в面向对象的 программировании. Это просто означает, что не одно значение. То есть, поведение одного объекта (метод, оператор или объект) может меняться в зависимости от различных ситуаций. Например,

Оператор + в Java используется для выполнения двух специфических функций. При использовании с числами (целыми и дробными) выполняется операция сложения.

int a = 5;
int b = 6;
int sum = a + b; // sum = 11

Когда мы используем оператор + с строками, он выполняет операцию соединения строк. Например,

String firstName = "abc ";
String lastName = "xyz";
name = firstName + lastName; // name = abc xyz

Типы полиморфизма

В Java полиморфизм можно разделить на два типа:

  • Полиморфизм в runtime

  • Компиляционный полиморфизм

Полиморфизм в runtime

В Java полиморфизм в runtime можно реализовать через перегрузку методов.

Предположим, что в родительском классе и его подклассе создан одинаковый метод. В этом случае, вызываемый метод зависит от объекта, который используется для вызова этого метода. Например,

Пример 1: перегрузка методов

abstract class Animal {
   public abstract void makeSound();
}
class Dog extends Animal {
   @Override
   public void makeSound() {
      System.out.println("Bark bark..");
   }
}
class Cat extends Animal {
   @Override
   public void makeSound() {
      System.out.println("Мяу-мяу..")}
   }
}
class Main {
   public static void main(String[] args) {
     Dog d1 = new Dog();
      d1.makeSound();
      Cat c1 = new Cat();
      c1.makeSound();
   }
}

Вывод:

Гав-гав...
Мяу-мяу...

Чтобы понять, как работает перегрузка методов, пожалуйста, посетитеПерегрузка методов в Java.

В примере выше метод makeSound() имеет разное реализация в двух разных классах. Когда мы запускаем программу

  • Выражение d1.makeSound() вызовет метод класса Dog. Это потому, что d1 является объектом класса Dog.

  • Выражение c1.makeSound() вызовет метод класса Cat. Это потому, что c1 является объектом класса Cat.

Метод вызывается в процессе выполнения программы. Поэтому перегрузка方法是 полиморфизм в runtime.

Компиляционный полиморфизм

Полиморфизм в компиляции можно реализовать с помощью перегрузки методов и перегрузки операторов в Java.

Метод перегрузки

В классе Java, если параметры различаются, можно создать методы с одним и тем же именем. Например,

void func() { ... }
void func(int a) { ... }
float func(double a) { ... }
float func(int a, float b) { ... }

В Java это называется перегрузкой методов.

Давайте рассмотрим пример перегрузки методов.

Пример 3: Перегрузка методов

class Demo {
 public void displayPattern() {
   for(int i = 0; i < 10; i++) {
     System.out.print("*");
   }
 }
 public void displayPattern(char symbol) {
   for(int i = 0; i < 10; i++) {
     System.out.print(symbol);
   }
 }
}
class Main {
 public static void main(String[] args) {
   Demo d1 = new Demo();
   d1.displayPattern();
   System.out.println("\n");
   d1.displayPattern('#');
 }
}

Вывод:

**********
##########

В上面的 программе метод displayPattern() был перегружен.

  •  Если мы вызовем этот метод, не передавая هیچ параметров, будет создан узор * символа.

  •  Если мы вызовем этот метод, передавая символ в качестве параметра, будет создан узор # символа.

Чтобы получить больше информации о перегрузке методов, пожалуйста, посетитеМетод перегрузки

Java метод перегрузки VS метод перегрузки

  • В случае перегрузки методов методы должны быть в различных классах. Однако в случае перегрузки методов они должны быть в одном и том же классе.

  •  Методы перегрузки выполняются во время выполнения, а методы перегрузки во время компиляции.

Перегрузка операторов

Некоторые операторы в Java ведут себя по-разному в зависимости от операндов. Например,

  • Оператор + перегружен для выполнения арифметического сложения и соединения строк.

  • &、| и ! перегружены для логических и битовых операций.

Давайте посмотрим, как операторы перегружаются в Java.

Оператор + в Java используется для выполнения двух специфических функций. При использовании с числами (целыми и вещественными) он выполняет операцию сложения. Например,

int a = 5;
int b = 6;
int sum = a + b; // sum = 11

Когда мы используем оператор + с строками, он выполняет операцию соединения строк. Например,

String firstName = "abc ";
String lastName = "xyz";
name = firstName + lastName; // name = abc xyz

В языках, таких как C++, мы можем определить операторы для выполнения различных операций над различными операндами. Однако Java не поддерживает перегрузку операторов пользователя.

Для чего нужен полиморфизм?

Полиморфизм позволяет нам создавать единообразный код. Например,

Предположим, что нам нужно нарисовать круг и квадрат. Для этого мы можем создать класс Polygon, из которого будут наследоваться два подкласса Circle и square. В этом случае необходимо создать в обоих подклассах метод с тем же именем render(), а не метод с другим именем.

В нашем примере перегрузки методов мы используем один и тот же метод с именем displayPattern() для вывода двух разных шаблонов, чтобы поддерживать единообразие.

Метод print() в Java также является примером полиморфизма (перегрузка методов). Один и тот же метод используется для вывода различных типов значений, таких как char, int, String и т.д. Мы также можем использовать один и тот же метод для вывода нескольких значений за один раз.

полиморфные переменные

В Java объектные переменные (инстансовые переменные) представляют поведение полиморфных переменных. Это потому, что объектные переменные класса могут ссылаться на объекты своего класса и объектов его подклассов. Например,

class Animal {
   public void displayInfo() {
      System.out.println("I am an animal.");
   }
}
class Dog extends Animal {
   @Override
   public void displayInfo() {
      System.out.println("Я собака.");
   }
}
class Main {
   public static void main(String[] args) {
    
      // Объявление переменной объекта класса Animal a1
      Animal a1;
    
     // Создание объекта класса Animal
      a1 = new Animal();
      a1.displayInfo();
     // Создание объекта класса Dog
      a1 = new Dog();
      a1.displayInfo();
   }
}

Вывод:

Я животное.
Я собака.

В上面的 примере мы создали переменную объекта класса Animal a1. Здесь a1 является полиморфной переменной.

Это потому что,

  • В предложении a1 = new Animal() ссылка a1 ссылается на объект класса Animal.

  • В предложении a1 = new Dog() ссылка a1 ссылается на объект класса Dog.

Это пример upward转型 в Java. Для получения дополнительной информации, пожалуйста, посетитеJava upward и downward преобразования.