logo

Java'da çok biçimlilik

Java'da çok biçimlilik gerçekleştirebileceğimiz bir kavramdır. farklı şekillerde tek eylem . Polimorfizm 2 Yunanca kelimeden türemiştir: poli ve morflar. 'Poly' kelimesi çok anlamına gelir ve 'morphs' formlar anlamına gelir. Yani polimorfizm birçok form anlamına gelir.

Java'da iki tür polimorfizm vardır: derleme zamanı polimorfizmi ve çalışma zamanı polimorfizmi. Yöntemin aşırı yüklenmesi ve yöntemin geçersiz kılınması yoluyla Java'da polimorfizm gerçekleştirebiliriz.

Java'da statik bir yöntemi aşırı yüklerseniz, bu derleme zamanı polimorfizmi örneğidir. Burada Java'daki çalışma zamanı polimorfizmine odaklanacağız.


Java'da Çalışma Zamanı Polimorfizmi

Çalışma zamanı polimorfizmi veya Dinamik Yöntem Gönderimi geçersiz kılınan bir yönteme yapılan çağrının derleme zamanı yerine çalışma zamanında çözümlendiği bir süreçtir.

Bu süreçte geçersiz kılınan bir yöntem, bir üst sınıfın referans değişkeni aracılığıyla çağrılır. Çağrılacak yöntemin belirlenmesi, referans değişkeni tarafından atıfta bulunulan nesneye bağlıdır.

monitör boyutu nasıl bulunur

Öncelikle Çalışma Zamanı Polimorfizminden önceki upcasting'i anlayalım.

Yukarıya Yayınlama

Parent sınıfının referans değişkeni Child sınıfının nesnesine başvuruyorsa, buna upcasting adı verilir. Örneğin:

Pavandeep Rajan
Java'da yukarıya yayınlama
 class A{} class B extends A{} 
 A a=new B();//upcasting 

Yukarıya yayınlama için sınıf tipinin referans değişkenini veya bir arayüz tipini kullanabiliriz. Örneğin:

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

Burada B sınıfının ilişkisi şöyle olacaktır:

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

Object, Java'daki tüm sınıfların kök sınıfı olduğundan B IS-A Object yazabiliriz.


Java Çalışma Zamanı Polimorfizmi Örneği

Bu örnekte Bike ve Splendor olmak üzere iki sınıf oluşturuyoruz. Splendor sınıfı, Bike sınıfını genişletir ve run() yöntemini geçersiz kılar. Run yöntemini Parent sınıfının referans değişkeni ile çağırıyoruz. Alt sınıf nesnesine atıfta bulunduğundan ve alt sınıf yöntemi Ana sınıf yöntemini geçersiz kıldığından, alt sınıf yöntemi çalışma zamanında çağrılır.

Yöntem çağrısı derleyici tarafından değil JVM tarafından belirlendiğinden çalışma zamanı polimorfizmi olarak bilinir.

 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(); } } 
Şimdi Test Edin

Çıktı:

 running safely with 60km. 

Java Çalışma Zamanı Polimorfizmi Örnek: Banka

Bankanın faiz oranını elde etmek için bir yöntem sağlayan bir sınıf olduğu bir senaryoyu düşünün. Ancak faiz oranları bankalara göre farklılık gösterebilmektedir. Örneğin SBI, ICICI ve AXIS bankaları %8,4, %7,3 ve %9,7 faiz oranları sağlıyor.

Bankanın Java Çalışma Zamanı Polimorfizmi örneği

Not: Bu örnek aynı zamanda yöntem geçersiz kılmada da verilmiştir ancak herhangi bir yukarı yayın yapılmamıştır.

 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()); } } 
Şimdi Test Edin

Çıktı:

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

Java Çalışma Zamanı Polimorfizmi Örnek: Şekil

 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(); } } 
Şimdi Test Edin

Çıktı:

Yıldız topolojisi
 drawing rectangle... drawing circle... drawing triangle... 

Java Çalışma Zamanı Polimorfizmi Örnek: Hayvan

 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(); }} 
Şimdi Test Edin

Çıktı:

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

Veri Üyesiyle Java Çalışma Zamanı Polimorfizmi

Veri üyeleri değil, bir yöntem geçersiz kılınır, dolayısıyla çalışma zamanı polimorfizmi veri üyeleri tarafından elde edilemez.

Aşağıda verilen örnekte her iki sınıfın da veri üyesi hız sınırı vardır. Veri üyesine Parent sınıfının alt sınıf nesnesini ifade eden referans değişkeni ile erişiyoruz. Geçersiz kılınmayan veri üyesine eriştiğimiz için bu, Parent sınıfının veri üyesine her zaman erişecektir.

Kural: Çalışma zamanı polimorfizmi veri üyeleri tarafından sağlanamaz.

 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 } } 
Şimdi Test Edin

Çıktı:

 90 

Çok Düzeyli Kalıtımla Java Çalışma Zamanı Polimorfizmi

Çok seviyeli kalıtıma sahip Çalışma Zamanı Polimorfizminin basit örneğini görelim.

edith mack hirsch
 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(); } } 
Şimdi Test Edin

Çıktı:

 eating eating fruits drinking Milk 

Çıkış için deneyin

 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(); }} 
Şimdi Test Edin

Çıktı:

 Dog is eating 

BabyDog, eat() yöntemini geçersiz kılmadığı için Dog sınıfının eat() yöntemi çağrılır.