logo

Полиморфизам у Јави

Полиморфизам у Јави је концепт којим можемо извести а појединачна акција на различите начине . Полиморфизам је изведен од 2 грчке речи: поли и морф. Реч „поли“ значи много, а „морфи“ означавају форме. Дакле, полиморфизам значи много облика.

Постоје два типа полиморфизма у Јави: полиморфизам у време компајлирања и полиморфизам у времену извођења. Можемо да извршимо полиморфизам у Јави преоптерећењем метода и заменом метода.

Ако преоптерећујете статичку методу у Јави, то је пример полиморфизма времена компајлирања. Овде ћемо се фокусирати на полиморфизам времена извршавања у Јави.


Полиморфизам времена извршавања у Јави

Полиморфизам времена рада или Динамиц Метход Диспатцх је процес у коме се позив преодређеној методи решава у време извођења, а не у време компајлирања.

јава ретурн команда

У овом процесу, замењени метод се позива преко референтне променљиве суперкласе. Одређивање методе која ће бити позвана заснива се на објекту на који референтна променљива упућује.

Хајде да прво разумемо упцастинг пре Рунтиме полиморфизма.

Упцастинг

Ако се референтна варијабла Родитељске класе односи на објекат Цхилд класе, то је познато као упцастинг. На пример:

Упцастинг у Јави
 class A{} class B extends A{} 
 A a=new B();//upcasting 

За упцастинг можемо користити референтну променљиву типа класе или типа интерфејса. На пример:

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

Овде би однос Б класе био:

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

Пошто је Објецт основна класа свих класа у Јави, можемо написати Б ИС-А Објецт.


Пример полиморфизма Јава Рунтиме

У овом примеру креирамо две класе Бике и Сплендор. Класа Сплендор проширује класу Бике и замењује њен рун() метод. Позивамо методу рун помоћу референтне променљиве класе Парент. Пошто се односи на објекат поткласе и метод подкласе замењује метод класе Родитељ, метод подкласе се позива у време извођења.

Пошто позивање метода одређује ЈВМ, а не компајлер, то је познато као полиморфизам времена извршавања.

 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. 

Пример полиморфизма Јава Рунтиме: Банка

Размотрите сценарио где је Банка класа која обезбеђује метод за добијање каматне стопе. Међутим, каматна стопа се може разликовати у зависности од банке. На пример, СБИ, ИЦИЦИ и АКСИС банке дају каматну стопу од 8,4%, 7,3% и 9,7%.

Пример полиморфизма Јава Рунтиме банке

Напомена: Овај пример је такође дат у заобилажењу метода, али није било ажурирања.

 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 

Пример полиморфизма Јава Рунтиме: Облик

 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... 

Пример полиморфизма Јава Рунтиме: животиња

 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... 

Јава Рунтиме полиморфизам са чланом података

Метода се замењује, а не чланови података, тако да полиморфизам времена извршавања не може да се постигне члановима података.

упцастинг

У доле наведеном примеру, обе класе имају ограничење брзине за чланове података. Члану података приступамо преко референтне променљиве класе Парент која се односи на објекат поткласе. Пошто приступамо члану података који није замењен, он ће увек приступати члану података класе Парент.

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

 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 

Јава Рунтиме полиморфизам са наслеђивањем на више нивоа

Хајде да видимо једноставан пример полиморфизма времена извршавања са наслеђивањем на више нивоа.

 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 

Пошто БабиДог не превазилази методу еат(), па се позива метода еат() класе Дог.