1. Modul PBO – Teknokrat
52
POLIMORFISME (POLYMORPISHM)
Tujuan
Praktikan dapat memahami dan menjelaskan konsep polimorfisme dalam
perograman serta dapat mengimplementasikan ke dalam pemrograman Java.
POLIMORFISME
Polimorfisme (polymorpishm) bearti banyak bentuk (bahasa Yunani). Dalam pemrograman
berorientasi obyek, digunakan untuk memerintah obyek agar melakukan aksi atau tindakan yang
mungkin secara prinsip sama namun secara proses berbeda.
Dalam konsep yang lebih umum sering kali polymorphism disebut dalam istilah satu interface
banyak aksi. Contoh yang konkrit dalam dunia nyata yaitu mobil. Mobil yang ada dipasaran terdiri
atas berbagai tipe dan berbagai merk, namun semuanya memiliki interface kemudi yang sama,
seperti: stir, tongkat transmisi, pedal gas dan rem. Jika seseorang dapat mengemudikan satu jenis
mobil saja dari satu merk tertentu, maka orang itu akan dapat mengemudikan hamper semua jenis
mobil yang ada, karena semua mobil tersebut menggunakan interface yang sama.
Harus diperhatikan disini bahwa interface yang sama tidak berarti cara kerjanya juga sama. Misal
pedal gas, jika ditekan maka kecepatan mobil akan meningkat, tapi bagaiman proses peningkatan
kecepatan ini dapat berbeda-beda untuk setiap jenis mobil.Dengan menggunakan OOP maka dalam
melakukan pemecahan suatu masalah kita tidak melihat bagaimana cara menyelesaikan suatu
masalah tersebut (terstruktur) tetapi obyekobyek apa yang dapat melakukan pemecahan masalah
tersebut.
VIRTUAL METHOD INVOCATION (VMI)
Virtual method invocation (VMI) merupakan suatu hal yang sangat penting dalam konsep
polimorfisme. Syarat terjadinya VMI adalah sebelumnya sudah terjadi polymorphism. Pada saat
obyek yang sudah dibuat tersebut memanggil overridden method pada parent class, kompiler Java
akan melakukan invocation (pemanggilan) terhadap overriding method pada subclass, dimana yang
seharusnya dipanggil adalah overridden. Berikut adalah contoh terjadinya VMI:
Program 6-1
// Test.java
class Parent {
int x = 5;
public void info() {
System.out.println("Ini kelas Parent");
}
}
BAB
6
2. Modul PBO – Teknokrat
53
class Child extends Parent {
int x = 10;
public void info() {
System.out.println("Ini kelas Child");
}
}
public class Tes {
public static void main(String [] args) {
Parent tes = new Child();
System.out.println("Nilai x = " + tes.x);
tes.info();
}
}
Hasil Output
Nilai x = 5
Ini kelas Child
Berdasarkan program di atas, yang terjadi adalah:
· Obyek tes mempunyai behavior yang sesuai dengan runtime type bukan compile type
· Ketika compile time tes adalah Parent
· Ketika runtime tes adalah Child
· Jadi:
o tes hanya bisa mengakses variabel milik Parent
o tes hanya bisa mengakses method milik Child
Pada pembentukan
Parent tes = new Child();
Pertama kali akan menjalankan konstruktor Child, ketika bertemu super() maka akan menjalankan
konstruktor Parent (super class), setelah semua statement dieksekusi baru kemudian menjalankan
konstruktor Child (subclass).
POLYMORPHIC ARGUMENTS
Polymorphic arguments adalah tipe data suatu argumen pada suatu method yang bisa menerima
suatu nilai bertipe subclass-nya. Polymorphic arguments diperlukan, bertujuan untuk
mengefisiensikan pembuatan program. Misalnya suatu kelas memiliki banyak subclass, maka perlu
didefinisikan semua method yang menangani behaviour dari masing-masing subclass. Dengan
adanya polymorphic arguments cukup mendefinisikan satu method saja yang bisa digunakan untuk
menangani behaiour semua kelas. Berikut adalah contoh dari polymorphic arguments:
Program 6-
2
// food.java
public class food {
void eat() { System.out.println("this food is great"); }
}
3. Modul PBO – Teknokrat
54
// tuna.java
public class tuna extends food {
void eat() { System.out.println("this tuna is great"); }
}
// potpie.java
public class potpie extends food {
void eat() { System.out.println("this potpie is great"); }
}
// apples.java
public class apples {
public static void main(String [] args) {
patty bucky = new patty();
food fo = new food();
food po = new potpie();
// penerapan polymorphic argument
bucky.digest(fo);
bucky.digest(po);
}
}
Hasil Output
this food is great
this potpie is great
OPERATOR INSTANCEOF
Pernyataan instanceof sangat berguna untuk mengetahui tipe asal dari suatu polymorphic
arguments. Untuk lebih jelas, berikut kita modifikasi contoh program sebelumnya:
Program 6-
3
// food.java
public class food {
void eat() {
System.out.println("this food is great");
}
}
// tuna.java
public class tuna extends food {
void eat() {
System.out.println("this tuna is great");
}
}
// potpie.java
public class potpie extends food {
void eat() {
System.out.println("this potpie is great");
}
}
4. Modul PBO – Teknokrat
55
// patty.java
public class patty {
public void digest(food x) {
if(x instanceof tuna) {
tuna t = (tuna) x;
t.eat();
} else if(x instanceof potpie) {
potpie p = (potpie) x;
p.eat();
} else {
x.eat();
}
}
}
// apples.java
public class apples {
public static void main(String [] args) {
patty bucky = new patty();
tuna fo = new tuna();
potpie po = new potpie();
bucky.digest(fo);
bucky.digest(po);
}
}
Hasil Output
this potpie is great
this tuna is great
Pemakaian instanceof seringkali diikuti dengan casting obyek dari tipe parameter ke tipe asal.
Contohnya pada program di atas, pada saat kita melakukan instanceof dari tipe tuna, kita dapat
melakukan casting object ke tipe asalnya, yaitu tuna. Berikut adalah cara untuk melakukan casting:
Program 6-4
// patty.java
public class patty {
public void digest(food x) {
// ...
if(x instanceof tuna) {
tuna t = (tuna) x;
// ...
}
// ...
}
}
Tanpa melakukan casting obyek, maka nilai yang akan kita pakai setelah proses instanceof masih
bertipe parent class-nya, sehingga jika tipe tersebut perlu dipakai maka harus dicasting terlebih
dahulu ke tipe subclass-nya.
5. Modul PBO – Teknokrat
56
OVERRIDING
Overriding adalah suatu keadaan dimana subclass memodifikasi tingkah laku yang diwarisi dari super
class. Tujuannya untuk menspesifikan tingkah laku dari subclass tersebut. Overriding dilakukan
dengan cara mendeklarasikan kembali method milik super class di dalam sub class. Deklarasi method
pada subclass harus sama dengan yang terdapat pada di super class, yaitu kesamaan pada nama,
return type, dan daftar parameter (jumlah, tipe, dan urutan). Method pada parent class disebut
overriden method dan pada subclass disebut overriding method. Berikut ini contoh terjadinya
overriding:
Program 6-5
// Employee.java
public class Employee {
protected String name;
protected double salary;
protected Date birthDate;
public String getDetails() {
return "Name: " + name + "n" +
"Salary: " + salary;
}
}
// Manager.java
public class Manager extends Employee {
protected String departement;
public String getDetail() {
return "Name: " + name + "n" +
"Salary: " + salary + "n" +
"Manager of: " + departement;
}
}
Program 6-6
// Animal.java
public class Animal {
public void setVoice() {
System.out.println("Blesesppblesep");
}
}
// Dog.java
public class Dog extends Animal {
public void setVoice() {
System.out.println("Hug..hug..");
}
}
Berdasarkan contoh program di atas, terjadinya overriding pada method getDetails, dimana method
tersebut di-override oleh kelas Manager. Method yang terkena override (overriden method)
diharuskan tidak boleh mempunyai modifier yang lebih luas aksesnya dari method yang meng-
override (overriding method).
6. Modul PBO – Teknokrat
57
OVERLOADING
Overloading adalah suatu keadaan dimana beberapa method memiliki nama yang sama namun
mempunyai fungsionalitas yang berbeda. Tujuannya untuk memudahkan penggunaan/pemanggilan
method dengan fungsional yang mirip. Dalam pendeklarasian overloading aturan yang digunakan
yaitu nama method harus sama, daftar parameter harus berbeda, dan return type boleh sama, juga
boleh berbeda. Berikut adalah contoh implementasi overloading:
Program 6-7
// MethodOverload.java
public class MethodOverload {
public void test() {
System.out.println("Kuadrat dari integer 7 = " + kuadrat(7));
System.out.println("Kuadrat dari double 7.5 = " + kuadrat(7.5));
}
// method kuadrat untuk integer
public int kuadrat(int bil) {
return bil * bil;
}
// method kuadrat untuk double
public double kuadrat(double bil) {
return bil * bil;
}
}
// MethodOverloadRun.java
public class MethodOverloadRun {
public static void main(String [] args) {
MethodOverload x = new MethodOverload();
x.test();
}
}
Berdasarkan kode program di atas, method yang di-overloading adalah kuadrat. Berikut adalah
perbedaan pada kedua method tersebut:
Tabel 6. 1 Contoh method overloading
Tipe return Nama method Daftar Parameter
int Kuadrat (int bil)
double Kuadrat (double bil)
↓ ↓ ↓
Berbeda Sama Berbeda
Berikut adalah contoh potongan kode program yang menerapkan method overloading:
7. Modul PBO – Teknokrat
58
public class Bentuk {
// ...
public void Gambar(int t1) {
// ...
}
public void Gambar(int t1, int t2) {
// ...
}
public void Gambar(int t1, int t2, int t3) {
// ...
}
public void Gambar(int t1, int t2, int t3, int t4) {
// ...
}
}
Overloading juga bisa terjadi antara parent class dengan subclass-nya jika memenuhi ketiga syarat
overload yang sudah disebutkan sebelumnya. Misalnya dari kelas Bentuk pada kode program
sebelumnya diturunkan menjadi kelas baru yang bernama WarnaiBentuk, seperti berikut:
public class Bentuk {
public void Gambar(String warna, int t1) {
// ...
}
public void Gambar(String warna, int t1, int t2) {
// ...
}
// ...
}
CONSTUCTOR OVERLOADING
Suatu kelas bisa memiliki lebih dari satu konstruktor dengan syarat daftar paramenternya tidak
boleh ada yang sama, bentuk inilah yang dinamakan dengan konstruktor overloading. Berikut adalah
contoh bentuk konstruktor overloading:
Program 6-8
// Mahasiswa.java
public class Mahasiswa {
private String npm;
private String nama;
private int umur;
public Mahasiswa() {
// Default konstruktor
npm = "";
nama = "";
umur = 18;
}
8. Modul PBO – Teknokrat
59
public Mahasiswa(String npm, String nama, int umur) {
// Parameter konstruktor
this.npm = npm;
this.nama = nama;
this.umur = umur;
}
// Getter & Setter Method
public String getNpm() {
return npm;
}
public void setNpm(String npm) {
this.npm = npm;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
public int getUmur() {
return umur;
}
public void setUmur(int umur) {
this.umur = umur;
}
}
// MahasiswaOverloadingTest.java
public class MahasiswaOverloadingTest {
public static void main(String [] args) {
Mahasiswa obj = new Mahasiswa();
System.out.println("NPM : " + obj.getNpm());
System.out.println("Nama : " + obj.getNama());
System.out.println("Umur : " + obj.getUmur());
Mahasiswa obj2 = new Mahasiswa("12312343", "Anditya", 19);
System.out.println("NPM : " + obj2.getNpm());
System.out.println("Nama : " + obj2.getNama());
System.out.println("Umur : " + obj2.getUmur());
}
}
9. Modul PBO – Teknokrat
60
Lembar Kerja Praktikum: Modul 6
NPM: Asisten:
Nama: Nilai:
Kelas: Tanggal:
Soal
Perhatikan kelas diagram berikut:
1. Jelaskan pengertian dari Polimorfisme, Overloading, dan Overriding.
2. Jelaskan perbedaan antara Polimorfisme dengan Inheritance.
3. Jelaskan perbedaan antara Overloading dengan Overriding.