Java’da çok biçimlilik (Polymorphism) kavramı birçok türe sahip olmak anlamına gelmektedir. Gerçek hayattan örnek vermemiz gerekirse; bir kişinin birden fazla görevi yapması, misal erkek olan biri, bir koca, bir çalışan veya bir baba olabilir. Yani aynı kişi farklı davranışlara sahip olabilir ve farklı görevlere sahip olabilir. Java’da çok biçimlilik (Polymorphism), bir nesnenin farklı nesneler gibi davranabilmesini sağlayabiliriz, farklı sınıflardan oluşturulmuş nesneleri tanımlayabilme gibi özellikler mevcuttur.
Java’da Çok Biçimlilik (Polymorphism) Avantajları
- Birden çok veri türünü depolamak için tek değişken kullanılabilir.
- Farklı işlemler arasındaki bağlantıyı azaltır.
- Kodun tekrar kullanılması sağlanır.
- Yapılan programda hataları ayıklamak daha kolay olur.
Metot Overloading (Aşırı Yükleme) ile Çok Biçimlilik
Bu yöntemimiz bilindik ve çok kullanılan bir yöntemdir. Java sınıfımızda, parametreler farklı ise aynı isime sahip metotlar oluşturabiliriz ve buna da aşırı yükleme deriz. Örneğimize geçelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | class Ornek { //paramtetresiz bir metot oluşturduk public void horoz() { System.out.println("Horoz"); } //aşırı yükleme için metodumuza parametre girdik. public void horoz(String isim) { System.out.println("Denizli Horozu"); } } class Main { public static void main(String[] args) { //nesnemizi oluşturduk. Ornek ornk = new Ornek(); //parametresi olmayan metodumuzu çağırdık ornk.horoz(); //paramteresi olan metodumuzu çağırdık ornk.horoz(""); } } |
Ekran Çıktısı
1 2 | Horoz Denizli Horozu |
Yapmış olduğumuz bu örnekte ilk olarak Ornek sınıfımızı oluşturduk, sınıfımızın içerisine aynı isimde parametreleri farklı iki metot tanımladık.Main sınıfımızda nesnemizi oluşturduk ve Ornek sınıfımıza erişim sağlayarak ekran çıktımızı verdik.
Metot Overriding ile Çok Biçimlilik
Java’da kalıtım sırasında aynı metot hem üst sınıfta hem de alt sınıfta mevcut ise üst sınıftaki metotu geçersiz kılmaktır. Bu işlemi şöylede anlayabiliriz, üst sınıftaki kullanılan metotlarımızı kendi ihtiyacımıza göre belirli yerlerini değiştirmeye metot overriding denilmektedir. Örneğimiz ile pekiştirelim:
Örnek
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | class Kuruyemis { public void goruntu() { System.out.println("Kuruyemişler"); } } //Override ederek sınıflarımızı oluşturduk ve içlerine metotlarımızı tanımladık. class Fındık extends Kuruyemis { @Override public void goruntu() { System.out.println("Fındık (Tadı güzelmiş he)"); } } class Ceviz extends Kuruyemis { @Override public void goruntu() { System.out.println("Ceviz"); } } class Main { public static void main(String[] args) { //kuruyemis sınıfından bir nesne oluşturduk Kuruyemis kryms = new Kuruyemis(); kryms.goruntu(); //Fındık sınıfından bir nesne oluşturduk. Fındık fndk = new Fındık(); fndk.goruntu(); //Ceviz sınıfından bir nesne oluşturduk. Ceviz cvz = new Ceviz(); cvz.goruntu(); } } |
Ekran Çıktısı
1 2 3 | Kuruyemişler Fındık (Tadı güzelmiş he) Ceviz |
Yapmış olduğumuz bu örnekte Kuruyemis adında bir üst sınıf oluşturduk sonrasında Fındık ve Ceviz adında alt sınıf oluşturduk ve içlerine metotlarımızı girdik. Main sınıfımızda nesnelerimizi oluşturup sınıfların içerisindeki bilgileri göstermeyi sağladık.
Java’da Çok Biçimlilik (Polymorphism) ile ilgili 2 tane daha örnek yapalım:
1. Örnek
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | class Sekil { //süper sınıfımızı oluşturduk // şekil oluşturma metodumuzu tanımladık public void olustur() { System.out.println("Şekil oluşturuluyor..."); } } class ucgen extends Sekil { // ucgen oluşturma metodumuzu tanımladık @Override public void olustur() { System.out.println("Üçgen şekli oluşturuluyor..."); } } class kare extends Sekil { // kare oluşturma metodumuzu tanımladık @Override public void olustur() { System.out.println("Kare şekli oluşturuluyor..."); } } //besgen oluşturma metodumuzu tanımladık class besgen extends Sekil { public void olustur() { System.out.println("Beşgen şekli oluşturuluyor..."); } } class Main { public static void main(String[] args) { // Sekil sınıfımız ile bağlantı kurmak için sekil nesnemizi oluşturduk Sekil sekil = new Sekil(); sekil.olustur(); //aynı şekilde aşağıdada nesnelerimizi oluşturduk. ucgen ucgen = new ucgen(); ucgen.olustur(); kare kare = new kare(); kare.olustur(); besgen besgen = new besgen (); besgen.olustur(); } } |
Ekran Çıktısı
1 2 3 4 | Şekil oluşturuluyor... Üçgen şekli oluşturuluyor... Kare şekli oluşturuluyor... Beşgen şekli oluşturuluyor... |
Yapmış olduğumuz örnekte ana sınıf yani süper sınıf oluşturduk. Sonrasında ise 3 tane alt sınıf oluşturduk ve içlerine metotlarımızı tanımladık. Main sınıfımızda ise nesnelerimizi oluşturduk ve ekran çıktımızı verdik.
2. Örnek
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | class Hayvan { private String isim; public Hayvan (String isim) { this.isim=isim; } public String getisim() { return isim; } public void setisim (String isim) { this.isim=isim; } public void ses() {//ses metodu oluşturduk. System.out.println("Hayvan sesi"); } } //extends anahtar kelimemiz ile Hayvan sınıfından türemesini sağladık. class horoz extends Hayvan { //constructorı ekledik public horoz(String isim) { super(isim); } public void ses ()//metodumuzu oluşturduk { System.out.println(getisim() + " Ötüyor"); } } class kangal extends Hayvan { //constructorı ekledik public kangal(String isim) { super(isim); } public void ses () {//metodumuzu oluşturduk System.out.println(getisim() + " Havlıyorr"); } } class esek extends Hayvan { //constructorı ekledik public esek(String isim) { super(isim); } public void ses () {//metodumuzu oluşturduk System.out.println(getisim() + " anırıyor"); } } class arı extends Hayvan { //constructorı ekledik public arı(String isim) { super(isim); } public void ses () //metodumuzu oluşturduk { System.out.println(getisim() + " vızıldıyor"); } } public class Main { public static void main(String[] args) { //nesnelerimizi oluşturduk. Hayvan hyvn = new Hayvan("Hayvan"); kangal kngl = new kangal("Kangal"); esek esk = new esek("Eşşek"); arı ar = new arı("Arı"); horoz hrz = new horoz("Denizli horozu"); //metodumuzu çağırdık hyvn.ses(); kngl.ses(); esk.ses(); ar.ses(); hrz.ses(); } } |
Ekran Çıktısı
1 2 3 4 5 | Hayvan sesi Kangal Havlıyorr Eşşek anırıyor Arı vızıldıyor Denizli horozu Ötüyor |
Yapmış olduğumuz 2. örnekte ilk olarak Hayvan sınıfımızı oluşturduk ve ortak özelliklerini tanımladım. Sonrasında ise hayvanlara ait sınıflar oluşturdum ve içerisine ses, isim gibi özellikler tanımladım. Main sınıfımızda sınıflara erişebilmek için nesneler oluşturtum ve metotlar aracılığıyla ekran çıktısını aldım.
Hakikaten güzel mi tadı? O yediğin amcamdı vicdansız, üç çocuğu öksüz bir kadını dul bıraktın arkada! Ne yapacaklar şimdi onlar?