logo

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

Полиморфизъм в Java е концепция, чрез която можем да извършим a едно действие по различни начини . Полиморфизмът произлиза от 2 гръцки думи: поли и морфи. Думата „поли“ означава много, а „морфи“ означава форми. Така че полиморфизмът означава много форми.

В Java има два вида полиморфизъм: полиморфизъм по време на компилиране и полиморфизъм по време на изпълнение. Можем да извършим полиморфизъм в java чрез претоварване на метод и отмяна на метод.

tostring java метод

Ако претоварите статичен метод в Java, това е примерът за полиморфизъм по време на компилиране. Тук ще се съсредоточим върху полиморфизма по време на изпълнение в java.


Полиморфизъм по време на изпълнение в Java

Полиморфизъм по време на изпълнение или Изпращане на динамичен метод е процес, при който извикване на отменен метод се разрешава по време на изпълнение, а не по време на компилиране.

В този процес се извиква заместен метод чрез референтната променлива на суперклас. Определянето на метода, който ще бъде извикан, се основава на обекта, към който се отнася референтната променлива.

Нека първо разберем upcasting-а преди полиморфизма по време на изпълнение.

Възходящо предаване

Ако референтната променлива на родителския клас се отнася до обекта на дъщерния клас, това е известно като upcasting. Например:

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.

str.replace в java

Пример за полиморфизъм на 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(); } } 
Тествайте сега

Изход:

примерно двоично дърво за търсене
 running safely with 60km. 

Пример за полиморфизъм по време на изпълнение на Java: банка

Помислете за сценарий, при който Bank е клас, който предоставя метод за получаване на лихвения процент. Лихвеният процент обаче може да се различава според банките. Например банките SBI, ICICI и AXIS предоставят 8,4%, 7,3% и 9,7% лихвен процент.

Пример за банка за полиморфизъм на Java Runtime

Забележка: Този пример също е даден при отмяна на метод, но не е имало преобразуване.

 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 Runtime: Форма

 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 с член на данните

Отменя се метод, а не членовете на данните, така че полиморфизмът по време на изпълнение не може да бъде постигнат от членовете на данните.

В дадения по-долу пример и двата класа имат ограничение на скоростта на член на данните. Осъществяваме достъп до члена на данните чрез референтната променлива на родителския клас, която препраща към обекта на подкласа. Тъй като осъществяваме достъп до члена с данни, който не е отменен, следователно той винаги ще има достъп до члена с данни на родителския клас.

Правило: Полиморфизмът по време на изпълнение не може да бъде постигнат от членове на данни.

 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.