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
}
}
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 +
‘}’;
}
}
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 |
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;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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());
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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();
}
}
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
private List
public void add(T item) {
listItem.add(item);
}
public T get(int index) {
return listItem.get(index);
}
}
public class ParametricDemo private List
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
*/
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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;
}
}
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();
}
}
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
16