logo

Поліморфізм в Java

Поліморфізм в Java це концепція, за допомогою якої ми можемо виконати a однієї дії різними способами . Поліморфізм походить від двох грецьких слів: полі і морфи. Слово «poly» означає багато, а «morphs» означає форми. Отже, поліморфізм означає багато форм.

У Java існує два типи поліморфізму: поліморфізм під час компіляції та поліморфізм під час виконання. Ми можемо виконувати поліморфізм у java шляхом перевантаження та перевизначення методів.

якщо ще в java

Якщо ви перевантажуєте статичний метод у Java, це є прикладом поліморфізму під час компіляції. Тут ми зосередимося на поліморфізмі часу виконання в java.


Поліморфізм часу виконання в Java

Поліморфізм часу виконання або Динамічний метод диспетчеризації це процес, у якому виклик перевизначеного методу вирішується під час виконання, а не під час компіляції.

У цьому процесі перевизначений метод викликається через посилальну змінну суперкласу. Визначення методу, який буде викликано, базується на об’єкті, на який посилається посилальна змінна.

Давайте спочатку розберемося з перетворенням перед виконанням поліморфізму.

Перетворення

Якщо посилальна змінна батьківського класу посилається на об’єкт дочірнього класу, це називається upcasting. Наприклад:

Перетворення в Java
 class A{} class B extends A{} 
 A a=new B();//upcasting 

Для upcasting ми можемо використовувати посилальну змінну типу класу або типу інтерфейсу. Наприклад:

 interface I{} class A{} class B extends A implements I{} 

Тут зв’язок класу B буде таким:

 B IS-A A B IS-A I B IS-A Object 

Оскільки Object є кореневим класом усіх класів у Java, ми можемо написати B IS-A Object.

словник сортування python

Приклад поліморфізму Java Runtime

У цьому прикладі ми створюємо два класи Bike і Splendor. Клас Splendor розширює клас Bike і замінює його метод run(). Ми викликаємо метод run за посиланням на змінну батьківського класу. Оскільки він посилається на об’єкт підкласу, а метод підкласу замінює метод батьківського класу, метод підкласу викликається під час виконання.

Оскільки виклик методу визначається JVM, а не компілятором, він відомий як поліморфізм часу виконання.

 class Bike{ void run(){System.out.println('running');} } class Splendor extends Bike{ void run(){System.out.println('running safely with 60km');} public static void main(String args[]){ Bike b = new Splendor();//upcasting b.run(); } } 
Перевірте зараз

Вихід:

не дорівнює mysql
 running safely with 60km. 

Приклад поліморфізму середовища виконання Java: банк

Розглянемо сценарій, де Bank — це клас, який надає метод отримання процентної ставки. Однак відсоткова ставка може відрізнятися залежно від банку. Наприклад, банки SBI, ICICI та AXIS пропонують процентну ставку 8,4%, 7,3% та 9,7%.

Приклад банку поліморфізму середовища виконання Java

Примітка. Цей приклад також наведено в методі перевизначення, але не було перетворення.

 class Bank{ float getRateOfInterest(){return 0;} } class SBI extends Bank{ float getRateOfInterest(){return 8.4f;} } class ICICI extends Bank{ float getRateOfInterest(){return 7.3f;} } class AXIS extends Bank{ float getRateOfInterest(){return 9.7f;} } class TestPolymorphism{ public static void main(String args[]){ Bank b; b=new SBI(); System.out.println('SBI Rate of Interest: '+b.getRateOfInterest()); b=new ICICI(); System.out.println('ICICI Rate of Interest: '+b.getRateOfInterest()); b=new AXIS(); System.out.println('AXIS Rate of Interest: '+b.getRateOfInterest()); } } 
Перевірте зараз

Вихід:

 SBI Rate of Interest: 8.4 ICICI Rate of Interest: 7.3 AXIS Rate of Interest: 9.7 

Приклад поліморфізму середовища виконання Java: форма

 class Shape{ void draw(){System.out.println('drawing...');} } class Rectangle extends Shape{ void draw(){System.out.println('drawing rectangle...');} } class Circle extends Shape{ void draw(){System.out.println('drawing circle...');} } class Triangle extends Shape{ void draw(){System.out.println('drawing triangle...');} } class TestPolymorphism2{ public static void main(String args[]){ Shape s; s=new Rectangle(); s.draw(); s=new Circle(); s.draw(); s=new Triangle(); s.draw(); } } 
Перевірте зараз

Вихід:

 drawing rectangle... drawing circle... drawing triangle... 

Приклад поліморфізму середовища виконання Java: тварина

 class Animal{ void eat(){System.out.println('eating...');} } class Dog extends Animal{ void eat(){System.out.println('eating bread...');} } class Cat extends Animal{ void eat(){System.out.println('eating rat...');} } class Lion extends Animal{ void eat(){System.out.println('eating meat...');} } class TestPolymorphism3{ public static void main(String[] args){ Animal a; a=new Dog(); a.eat(); a=new Cat(); a.eat(); a=new Lion(); a.eat(); }} 
Перевірте зараз

Вихід:

 eating bread... eating rat... eating meat... 

Поліморфізм Java Runtime з елементом даних

Перевизначається метод, а не члени даних, тому поліморфізм часу виконання не може бути досягнутий членами даних.

У наведеному нижче прикладі обидва класи мають обмеження швидкості члена даних. Ми отримуємо доступ до члена даних за посиланням на змінну батьківського класу, яка посилається на об’єкт підкласу. Оскільки ми звертаємося до елемента даних, який не перевизначено, отже, він завжди матиме доступ до елемента даних батьківського класу.

Правило: поліморфізм часу виконання не може бути досягнутий елементами даних.

 class Bike{ int speedlimit=90; } class Honda3 extends Bike{ int speedlimit=150; public static void main(String args[]){ Bike obj=new Honda3(); System.out.println(obj.speedlimit);//90 } } 
Перевірте зараз

Вихід:

 90 

Поліморфізм Java Runtime з багаторівневим успадкуванням

Давайте розглянемо простий приклад поліморфізму часу виконання з багаторівневим успадкуванням.

if else if else java
 class Animal{ void eat(){System.out.println('eating');} } class Dog extends Animal{ void eat(){System.out.println('eating fruits');} } class BabyDog extends Dog{ void eat(){System.out.println('drinking milk');} public static void main(String args[]){ Animal a1,a2,a3; a1=new Animal(); a2=new Dog(); a3=new BabyDog(); a1.eat(); a2.eat(); a3.eat(); } } 
Перевірте зараз

Вихід:

 eating eating fruits drinking Milk 

Спробуйте для виведення

 class Animal{ void eat(){System.out.println('animal is eating...');} } class Dog extends Animal{ void eat(){System.out.println('dog is eating...');} } class BabyDog1 extends Dog{ public static void main(String args[]){ Animal a=new BabyDog1(); a.eat(); }} 
Перевірте зараз

Вихід:

 Dog is eating 

Оскільки BabyDog не перевизначає метод eat(), тому викликається метод eat() класу Dog.