Anotasyon

Java Polymorphism

Merhaba arkadaşlar,
mobilhanem.com üzerinden anlattığımız/yayınladığımız derslerimize Java Nesne Yönelimli Programlama başlığı altında Java Polymorphism konusuyla devam ediyoruz.

Polymorphism bir varlığın veya bir nesnenin birden fazla forma sahip olmasıdır denilebilir. Java Polymorphism yaptığım bu genel tanıma çok yakın özelliklere sahiptir. Java Polymorphism konusunu 4 başlık altında ele alabiliriz.

Java Polymorphism

1. Coercion

Java’nın sahip olduğu bir özellik olan Implicit Type Conversion (Örtük Türde Dönüştürme) polymorphism in alt başlıklarından Coercion yapısını anlatmada en iyi yöntem olabilir. Veri tiplerinin birbirine dönüştürülmesi konusunu ele alıp temel tiplerden bir örnek oluşturalım. Örnek Java kodumuzda bir int değişken oluşturalım bir de float değişken oluşturalım. Oluşturduğumuz bu değişkenlere değer atayalım. Ardından int olarak tanımladığımız değişkeni float olarak tanımladığımız değişkene bölelim. Burada derleyici hata ile karşılaşılmasını önlemek için integer tipte tanımlanan değişkeni float tipinde bir değişkene çevirerek işlemi yapar. Aşağıdaki kod ile ne anlatmaya çalıştığımı daha iyi anlayabilirsiniz.

public class CoercionDemo {
  public static void main(String[] args) {
    int intDeger = 2;
    float floatDeger = 2.5f;
    //intDeger derleyici tarafından float tipinde bir degiskene donusturuluyor.
    float sonuc = intDeger / floatDeger;   
    System.out.println(sonuc);
    //output: 0.8
  } 
}

Yukarıdaki kodda konsola yazdırılan sonuç “0.8” olacaktır. int tipindeki intDeger işlem sırasında derleyici tarafından float tipine dönüştürülerek işlem yapılmıştır. 

Temel tipteki bu yapıyı örnek alarak kendi sınıflarımızla bir örnek oluşturabiliriz. Vereceğim örneği açıklayacak en güzel cümle şu olacaktır. “Derleyici işlemleri yaparken, subclass türünü superclass türüne dönüştürür ve yapılabilecek işlemleri superclass’ ın özellikleriyle sınırlandırır.”

public class Person {

    private String name;
    private String surname;
    private String identityNum;
    private int birthYear;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public String getIdentityNum() {
        return identityNum;
    }

    public void setIdentityNum(String identityNum) {
        this.identityNum = identityNum;
    }

    public int getBirthYear() {
        return birthYear;
    }

    public void setBirthYear(int birthYear) {
        this.birthYear = birthYear;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", surname='" + surname + '\'' +
                ", identityNum='" + identityNum + '\'' +
                ", birthYear=" + birthYear +
                '}';
    }
}
public class Employee extends Person {

    private String jobTitle;
    private long salary;

    public String getJobTitle() {
        return jobTitle;
    }

    public void setJobTitle(String jobTitle) {
        this.jobTitle = jobTitle;
    }

    public long getSalary() {
        return salary;
    }

    public void setSalary(long salary) {
        this.salary = salary;
    }
}
public class CoercionTest {

    public static void main(String[] args) {
        CoercionTest test = new CoercionTest();
        Employee employee = new Employee();
        employee.setName("Vehbi");
        employee.setSurname("Akdoğan");
        employee.setBirthYear(1990);
        employee.setIdentityNum("11111111110");
        employee.setJobTitle("CEO");
        employee.setSalary(100000L);

        test.writePersonInfo(employee);

    }
    
    public void writePersonInfo (Person person) {
        System.out.println(person.toString());
    }
}

Yukarıdaki örnek kod bloğu çalıştırıldığında sadece Person sınıfına ait bilgilerin yazdırıldığı Employee sınıfına ait jobTitle ve salary özelliklerinin yazdırılmadığı görülecektir.

2. Overloading

Java Polymorphism yapısında işimizi kolaylaştıran bir diğer yapıda Overloading’ dir. Java’da oluşturulan sınıf içerisinde aynı isme sahip birden fazla metodun olabilme özelliğidir. Burada dikkat edilmesi gereken özellik, aynı isme sahip metotların parametre sayıları veya parametre tiplerinde farklılıklar olmalıdır. Şöyle ki;

public class OverloadingDemo {
  public int method(int a) {
    return a; 
  }
  public int method(String b) {
    return Integer.parseInt(b);
  }
  
  public int sum(int a, int b){
    return a+b; 
  }
  public int sum(double c, double d) {
    Double sum = c + d;
    return sum.intValue();
  }
}

Bu şekilde overload özelliğinden faydalanarak bir çok metot yazılabilir ve istediğimiz metodu istediğimiz şekilde özelleştirebiliriz. Böylelikle yaptığımız aynı işlem için farklı isimde metodlar oluşturmak yerine aynı isimde farklı parametrelerle aynı işlemi yapan metotlar elde etmiş oluruz.

3. Parametric

Parametric Polymorphism Java’da diğer bir adıyla Generic olarak bilinmektedir. Bu konu başlığı altında çok detayına inmeden basitçe anlatarak bir örnek vermeye çalışacağım. Java’da bir alan String bir değer alarak yine String bir değer dönerken, yine aynı şekilde integer bir değer alarak yine integer bir değer dönebilir. Basitçe bir örnek üzerinden anlatmak gerekirse;

public class ParametricDemo<T> {
    private List<T> listItem = new ArrayList();

    public void add(T item) {
        listItem.add(item);
    }

    public T get(int index) {
        return listItem.get(index);
    }
}
public class ParametricTest {
    public static void main(String[] args) {
        ParametricDemo parametricDemo = new ParametricDemo();
        parametricDemo.add("mobilhanem");
        parametricDemo.add(1500);
        parametricDemo.add(100.011);
        parametricDemo.add(10.56f);

        System.out.println(parametricDemo.get(0));
        System.out.println(parametricDemo.get(1));
        System.out.println(parametricDemo.get(2));
        System.out.println(parametricDemo.get(3));
        /*
         * Output:
         * mobilhanem
         * 1500
         * 100.011
         * 10.56
         */
    }
}

4. Subtype

Java Polymorphism ile ilgili araştırma yaptığınızda bir çok yerde rastlayacağınız genel Polymorphism tanımı aslında subtype yapısının tanımıdır. Java’da subclass’lar (altsınıflar) superclass’ların onlara miras bıraktıkları değişkenleri ve metotları değiştirebilirler. Aynı zamanda değiştirmek istemedikleri metotları aynı şekilde kullanmaya devam edebilirler.

Aşağıdaki örnek Employee sınıfı Inheritance konusunda verilen Employee sınıfıyla birbir aynıdır.

public class Employee extends Person {

    private String jobtitle;

    public String getJobtitle() {
        return jobtitle;
    }

    public void setJobtitle(String jobtitle) {
        this.jobtitle = jobtitle;
    }
}

Employee sınıfını miras alacak yeni sınıfta kullanılacak jobTitle değişkenlerinin hepsinin başında Senior olsun. Konu göz önünde bulundurularak geliştirme yapıldığında aşağıdaki gibi bir sınıf ortaya çıkacaktır.

public class PolymorphismEmployee extends Employee {
    @Override
    public String getJobtitle() {
        return "Senior " + super.getJobtitle();
    } 
}

Bu değişiklikten sonra PolymorphismEmployee sınıfından alınacak her jobTitle değişkeninin başında Senior javacaktır. Bu şekilde çalışma anında PolymorphismEmployee sınıfı Employee sınıfının getJobTitle() metodunu Override ederek değiştirmiştir.

Sonuç

Java Nesne Yönelimli Programlama mantığı içerisinde Polymorphism geni kapsamlı bir yapıya sahiptir. Geliştirme esnasında bir çok kolaylık sağlar. Java’da nesne yönelimli programlama yapısına dikkat edilerek geliştirilen projelerde büyük bir yer tutar. Kodun daha okunabilir, kolay değiştirilebilir olmasına büyük katkı sağlar.

Konuyla ilgili yorumlarınızı konu altından yapabilirsiniz, ayrıca sorularınızı Mobilhanem Soru&Cevap bölümünden sorabilirsiniz.

Tüm Java Dersleri için tıklayınız..

Referanslar:
https://www.javaworld.com/article/3033445/learn-java/java-101-polymorphism-in-java.html
https://www.javaworld.com/article/2075223/core-java/reveal-the-magic-behind-subtype-polymorphism.html
18

Eren Başaran

Software Developer
Mobilhanem Yazarı

7 Yorum

  • Merhaba, yazınız detaylı ve akıcı anlatımda olmuş teşekkürler. overloading kısmındaki şu metodtan parametre ve metod içindeki değişken isimleri farklı görünüyor, aynı olması lazım.
    public int sum(double c, double d) {
    Double sum = a + b;
    return sum.intValue();
    }

  • Yıllardır tam olarak oturtamadığım Polymorphism konusu bu yazıdan sonra şak diye oturdu diyebilirim. Muazzam açıklayıcı olmuş. Ellerinize sağlık.

  • Merhaba,

    Öncelikle anlatımın için eline sağlık ancak anlamadığım bir nokta var açıklayabilirseniz memnun olurum.

    “Yukarıdaki örnek kod bloğu çalıştırıldığında sadece Person sınıfına ait bilgilerin yazdırıldığı Employee sınıfına ait jobTitle ve salary özelliklerinin yazdırılmadığı görülecektir.”

    Burada jobTittle ve salary alanlarının neden yazdırılmadığını anlayamadım ve yazdırmak için kodu nasıl evirebiliriz?

    • Anladığım kadarıyla, person.toString() yapıldığında person sınıfının toString methodu çağırılıyor ve bu methodun içinde jobTitle ve Salary gibi özelliklerin bastırılması istenmiyor.

    • ++ atlamışım.
      toString methodunun override ederiz employee sınıfı için ve jobtitle ve salary özelliklerini de ekleriz.

      @Override
      public String toString() {
      return super.toString() + jobTitle + salary;
      }

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?