“every step is a pain without solid foundation” ~ well that’s true hhaha. So kali ini mau cerita tentang “Polymorphism” di Java. Apa itu Polymorphism ? Polymorphism adalah kemampuan sebuah objek untuk mempunyai bentuk lebih dari satu. Sedikit bingung ? haha, artinya adalah sebuah objek bisa mempunyai reference dengan tipe A dan mempunyai bentuk objek dengan tipe B. Dengan catatan tipe B adalah merupakan tipe A, baik dengan inheritance, maupun dengan interface. Polymorphism ini sangat berguna ketika kita membuat method yang bisa menerima parameter yang tidak terikat hanya pada satu class saja.
Tipe reference dengan class Object
Sebenarnya semua objek pada Java adalah Polymorphic, karena semua objek merupakan subclass dari class tertinggi Java yaitu class “Object”. Sebagai contoh kita bisa membuat sebuah class dan membuat reference dari objek tersebut dengan tipe Object.
public class Person { private String firstName; private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public static void main (String args[]) { // objek person mempunyai reference dengan tipe "Object" Object person = new Person(); } }
Namun untuk mengakses attribute dan method dari objek “person” ini, kita harus melakukan type casting terlebih dahulu, karena reference dengan tipe “Object” tidak mengenal attribute maupun method dari class “Person”. Contoh :
public class Person { private String firstName; private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public static void main (String args[]) { // objek person mempunyai reference dengan tipe "Object" Object person = new Person(); // disini kita melakukan type casting ((Person) person).setFirstName("boni"); System.out.println(((Person) person).getFirstName()); } }
Tipe reference dengan Interface
Selain dengan class Object, kita juga bisa membuat reference dengan tipe interface, contoh :
public interface Grade { }
public class Person implements Grade { private String firstName; private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public static void main (String args[]) { // objek person mempunyai tipe reference dari interface Grade person = new Person(); } }
Polymorphism Method
So, apa manfaat dari polymorphism ini ? hehe, salah satu contoh sederhana adalah dengan membuat method yang bisa menerima parameter objek yang mempunyai sifat polymorphic. Pertama-tama disini kita akan membuat program sederhana tanpa menggunakan polymorphism :
Person.java
public class Person { private String firstName; private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
Student.java
public class Student { private String firstName; private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
Launcher.java
public class Launcher { public static void main (String args[]) { Person person = new Person(); person.setFirstName("boni"); person.setLastName("octavianus"); displayPersonName(person); Student student = new Student(); student.setFirstName("ned"); student.setLastName("stark"); displayPersonName(student); } private static void displayPersonName(Person person) { System.out.println("First Name : " + person.getFirstName()); System.out.println("Last Name : " + person.getLastName()); } private static void displayPersonName(Student student) { System.out.println("First Name : " + student.getFirstName()); System.out.println("Last Name : " + student.getLastName()); } }
Pada class Launcher.java, kita membuat dua objek dengan tipe “Person” dan “Student”, kemudian memanggil method “displayPersonName()”, yang masing-masing menerima parameter dengan tipe “Person” dan “Student”. Program sederhana ini berjalan dengan baik, tetapi dengan polymorphism program ini bisa menjadi lebih sederhana lagi. Contoh program yang sama dengan menggunakan polymorphism :
Person.java
public class Person { public String firstName; public String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
Student.java
public class Student extends Person { }
Launcher.java
public class Launcher { public static void main (String args[]) { Person person = new Person(); person.setFirstName("boni"); person.setLastName("octavianus"); displayPersonName(person); Person student = new Student(); student.setFirstName("ned"); student.setLastName("stark"); displayPersonName(student); } private static void displayPersonName(Person person) { System.out.println("First Name : " + person.getFirstName()); System.out.println("Last Name : " + person.getLastName()); } }
Program di atas akan tetap berjalan dengan normal namun dengan listing kode yang lebih sederhana hehe. Disini pertama-tama kita membuat class “Student” menjadi subclass dari class “Person”. Setelah itu kita membuat satu method “displayPersonName()” dengan menerima parameter objek Person. Karena class Student adalah subclass dari class “Person”, maka muncul hubungan “IS-A”. Student IS-A Person. Oleh karena itu dua objek dari class yang berbeda ini bisa menjadi parameter untuk method “displayPersonName()”.
Virtual Method
Selain itu polymorphism juga bisa membuat Virtual Method, yang artinya statement method diperiksa pada saat compile time, namun dieksekusi pada runtime. Contoh :
Person.java
public class Person { public String firstName; public String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public void displayFullName() { System.out.println("Person Name : " + firstName + " " + lastName); } }
Student.java
public class Student extends Person { @Override public void displayFullName() { System.out.println("Student Name : " + firstName + " " + lastName); } }
Launcher.java
public class Launcher { public static void main (String args[]) { Person person = new Student(); person.setFirstName("boni"); person.setLastName("octavianus"); person.displayFullName(); Student student = new Student(); student.setFirstName("ned"); student.setLastName("stark"); student.displayFullName(); } }
Output :
Student Name : boni octavianus
Student Name : ned stark
Disini kita membuat dua objek Student dengan tipe reference yang berbeda, tipe pertama adalah “Person”, dan tipe kedua adalah “Student”. Untuk tipe reference “Student”, compiler memeriksa apakah objek student ini mempunyai method “displayFullName()” ? Jika iya, maka compiler tidak akan memberikan pesan error, dan mengeksekusi method ini pada saat runtime.
Namun hal berbeda terjadi untuk objek dengan tipe reference “Person”, disini compiler memeriksa apakah objek person dengan tipe reference “Person” mempunyai method “displayFullName()” ? Jika iya, maka compiler tidak akan memberikan pesan error. Akan tetapi pada saat runtime, program mengeksekusi method “displayFullName()” pada class “Student”, bukan dari class “Person”. Nah hal ini disebut dengan “Virtual Method”, dimana method yang dioverride akan selalu dieksekusi pada saat runtime, terlepas dari tipe referencenya.
And that’s it, sedikit goresan pena virtual di malam hari, thanks for reading 🙂
Reference : tutorialspoint
Image : codepolitan
Terima kasih atas ilmunya, sangat bermanfaat sekali
SukaSuka
terimakasih untuk kunjungannya 🙂
SukaSuka