Polymorphism merupakan konsep OOP yang memberikan
fleksibilitas kepada programmer dalam menulis program. Dengan mengaplikasikan konsep polymorphism, programmer dapat
memperlakukan seluruh object yang berasal dari superclass yang
sama seakan-akan mereka adalah
object dari superclass.
Pada Java, konsep polymorphism
diimplementasikan melalui beberapa cara yaitu overloading, Overriding,
abstract class dan melalui interface.
Polymorphism berasal dari bahasa Yunani
yang berarti banyak bentuk. Dalam PBO, konsep ini memungkinkan digunakannya
suatu interface yang sama 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. Missal 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 obyek-obyek apa yang dapat melakukan pemecahan masalah tersebut. Sebagai
contoh anggap kita memiliki sebuah departemen yang memiliki manager,
sekretaris, petugas administrasi data dan lainnya.
Misal manager
tersebut ingin memperoleh data dari bag administrasi maka manager tersebut
tidak harus mengambilnya langsung tetapi dapat menyuruh petugas bag
administrasi untuk mengambilnya. Pada kasus tersebut seorang manager tidak
harus mengetahui bagaimana cara mengambil data tersebut tetapi manager bisa
mendapatkan data tersebut melalui obyek petugas adminiistrasi. Jadi untuk menyelesaikan
suatu masalah dengan kolaborasi antar obyek-obyek yang ada karena setiap obyek
memiliki deskripsi tugasnya sendiri.
Virtual Method Invocation (VMI) bisa terjadi jika terjadi
polimorfisme dan Overriding. 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 method. Berikut contoh terjadinya VMI:
Hasil dari running program diatas
adalah sebagai berikut:
Nilai x = 5
Ini class Child
Polymorphic
arguments adalah tipe suatu parameter yang menerima suatu nilai yang
bertipe subclass-nya. Berikut contoh
dari polymorphics arguments:
Pernyataan instanceof sangat berguna untuk
mengetahui tipe asal dari suatu polymorphic arguments. Untuk lebih jelasnya,
misalnya dari contoh program sebelumnya, kita sedikit membuat modifikasi pada
class Tes dan ditambah sebuah class baru Kurir, seperti yang tampak dibawah
ini:
Seringkali
pemakaian instanceof diikuti dengan
casting object dari tipe parameter ke
tipe asal. Misalkan saja program kita sebelumnya. Pada saat kita sudah
melakukan instanceof dari tipe
Manajer, kita dapat melakukan casting object
ke tipe asalnya, yaitu Manajer. Caranya adalah seperti berikut:
Overloading adalah suatu keadaan dimana beberapa method sekaligus dapat mempunyai nama
yang sama, akan tetapi mempunyai fungsionalitas yang berbeda. Contoh penggunaan
overloading dilihat dibawah ini:
·
Parameter
titik, untuk menggambar titik
Gambar(int t1)
·
Parameter
titik, untuk menggambar garis
Gambar(int t1,int t2)
·
Parameter
titik, untuk menggambar segitiga
Gambar(int t1,int t2,int t3)
·
Parameter
titik, untuk menggambar persegi empat
Gambar(int t1,int t2,int t3,int t4)
Overloading ini dapat terjadi pada class yang sama
atau pada suatu parent class dan subclass-nya.
Overloading mempunyai ciri-ciri
sebagai berikut:
1. Nama method harus sama
2. Daftar parameter harus berbeda
3. Return type boleh sama, juga boleh
berbeda
Tulislah
listing program berikut ini dan amati yang terjadi pada saat terjadinya overloading pada method.
Kita dapat
menyembunyikan information dari suatu class sehingga anggota-anggota class
tersebut tidak dapat diakses dari luar.
Adapun caranya adalah cukup dengan memberikan akses kontrol private
ketika mendeklarasikan suatu atribut atau method.
Contoh:
private int
nrp;
Contoh:
public class Siswa
{
private int nrp;
public void
setNrp(int n)
{ nrp=n; }
}
Konstruktor
(konstruktor) adalah suatu method yang
pertama kali dijalankan pada saat pembuatan suatu obyek. Konstruktor mempunyai
ciri yaitu:
o Mempunyai nama yang sama dengan nama class
o Tidak mempunyai return type (seperti void, int, double, dan
lain-lain)
Contoh:
public class Siswa
{ private
int nrp;
private String
nama;
public Siswa(int
n, String m)
{ nrp=n;
nama=m;
}
}
Suatu class
dapat mempunyai lebih dari 1 konstruktor dengan syarat daftar parameternya
tidak boleh ada yang sama.
Contoh:
public class Siswa
{
private int nrp;
private String
nama;
public
Siswa(String m)
{ nrp=0;
nama=””;
}
public Siswa(int
n, String m)
{ nrp=n;
nama=m;
}
}
Percobaan
Percobaan 1 : Melakukan
enkapsulasi pada suatu class
Jika enkapsulasi dilakukan pada class
diagram diatas, maka akan berubah menjadi:
Percobaan 2 : Melakukan overloading konstruktor
Dari class diagram tersebut, dapat
diimplementasikan ke dalam program sebagai berikut:
public class
Mahasiswa
{ private int nrp;
private
String nama;
public
Mahasiswa()
{ nrp=0;
nama=””; }
public
Mahasiswa(String nama)
{ nrp=0;
this.nama=nama; }
public
Mahasiswa(int nrp, String nama)
{ this.nrp=nrp;
this.nama=nama; }
}
Tulislah listing program berikut ini
dan amati yang terjadi pada saat terjadinya overloading
pada method.
Ketika program tersebut dijalankan,
akan tampak hasil seperti dibawah ini :
Buat segiempat dengan koordinat (25,25)
dan (50,50)
Segiempat:
<25 25="" 50="">25>
Buat segiempat dengan point (10,10) dan
point (20,20):
Segiempat:
<10 10="" 20="">10>
Buat segiempat dengan 1 point (10,10),
koodinat (50,50)
Segiempat:<10 10="" 60="">10>
Overriding adalah suatu keadaan dimana method pada subclass menolak method pada
parent class-nya. Overriding
mempunyai ciri-ciri sebagai berikut :
1.
Nama
method harus sama
2.
Daftar
parameter harus sama
3.
Return type harus sama
Berikut ini
contoh terjadinya Overriding dimana method Info()
pada class Child meng-override method Info() pada class parent:
Method yang terkena override (overridden method) diharuskan tidak boleh mempunyai modifier yang lebih luas aksesnya dari method yang meng-override
(Overriding method).
Pewarisan adalah kemampuan sebuah kelas untuk mewariskan seluruh atau sebagian
atribut dan methodnya ke kelas lain,
sehingga atribut dan method tersebut dikenal oleh kelas yang
menerima pewarisan tanpa harus
menuliskannya. Pewarisan ini merupakan implementasi dari hubungan antar kelas
generalisasi-spesialisasi.
Kelas yang
mewariskan disebut kelas induk, super
class, atau base class
sedangkan kelas yang menerima pewarisan disebut kelas anak, kelas
turunan, atau subclass.
Pewarisan dapat dilakukan jika :
•
Ada beberapa atribut dan method yang sama yang digunakan oleh beberapa kelas berbeda (reduksi penulisan
kode)
•
Ada satu atau beberapa kelas yang sudah pernah
dibuat yang dibutuhkan oleh aplikasi (reusability)
•
Ada perubahan kebutuhan fungsional atau feature
aplikasi dimana sebagian atau seluruh perubahan tersebut tercakup di satu atau
beberapa kelas yang sudah ada (extend)
2.1 Pewarisan
di Java
Pewarisan di Java
hanya mengenal pewarisan tunggal, artinya sebuah kelas hanya mewarisi atribut
dan method dari satu kelas induk.
Untuk menggunakan pewarisan di Java digunakan keyword extends.
Contoh pewarisan dapat dilihat pada diagram
kelas berikut ini:
Gambar 4‑10 Contoh Pewarisan Kelas
Pada diagram kelas
di atas, kelas Manager merupakan kelas turunan dari kelas Employee sehingga
mewarisi semua atribut dan method dari
kelas Employee yang bersifat public dan protected. Implementasi dari diagram
kelas di atas dalam Java adalah sebagai berikut:
//Employee.java
public class
Employee {
public String name;
public
Date birthDate;
public
double salary;
public
String getDetails() {...}
}
//Manager.java
public class
Manager extends Employee {
public
String department;
}
Dari kode di atas,
terlihat bahwa atribut name, birthDate, dan salary serta method getDetails() diturunkan ke kelas Manager sehingga kelas
Manager dapat menggunakan atribut dan method
tersebut. Konstruktor dari kelas induk tidak dapat diturunkan kepada kelas
turunannya.
Untuk menggunakan method dan konstruktor dari kelas induk
pada kelas anak digunakan keyword
super, contoh:
//Employee.java
public class
Employee {
private String name;
private double gaji;
public Employee
(String s, double g) {
name
= s;
gaji=g;
}
public double
getgaji() {
return gaji;
}
}
//Manager.java
public class
Manager extends Employee {
private String alamat;
private double tunjangan;
private double bonus;
public
Manager(String nama, String s) {
super(nama);
alamat = s;
}
Public double
getgaji() {
return (super.getgaji()+tunjangan+bonus);
}
}
Kelas abstrak
merupakan suatu bentuk khusus dari kelas di mana kelas tersebut tidak dapat
diinstansiasi dan digunakan hanya untuk diturunkan ke dalam bentuk kelas konkret
atau kelas abstrak berikutnya.
Kelas abstrak
dideklarasikan menggunakan keyword
abstract.
Di dalam kelas
abstrak dapat dideklarasikan atribut dan method
sama seperti kelas konkret, namun ada juga method abstrak, yaitu suatu method
yang tidak mempunyai implementasi hanya memiliki deklarasi saja, contoh:
public abstract class
LivingThing {
public void breath(){
Sistem.out.println("Living Thing
breathing...");
}
public void eat(){
Sistem.out.println("Living Thing eating...");
}
public abstract void walk(); //merupakan method abstrak
}
Ketika sebuah
kelas mewarisi sebuah kelas abstrak, kelas tersebut harus mendefinisikan
implementasi dari method abstrak yang
ada dalam kelas induknya. Jika tidak didefinisikan implementasinya, maka kelas
tersebut akan menjadi kelas abstrak juga, contoh:
public class Human extends LivingThing {
//implementasi dari method
abstrak walk()
public void walk(){
Sistem.out.println("Human
walks...");
}
}
Interface adalah prototype kelas yang
berisi definisi konstanta dan deklarasi method
(hanya nama method tanpa definisi
kode programnya). Dalam sebuah interface:
- Semua atribut adalah public, static dan final
(semua atribut bertindak sebagai konstanta)
- Semua method
adalah abstract dan public
- Tidak boleh ada deklarasi konstruktor
Interface digunakan untuk menyatakan spefisikasi
fungsional beberapa kelas secara umum. Dengan adanya interface, Java menyediakan sebuah fitur untuk keperluan pewarisan jamak
(Multiple inheritance).
Contoh interface
dan kegunaannya:
Untuk membuat interface di Java digunakan keyword interface. Source code untuk diagram kelas di atas dalam Java adalah sebagai
berikut:
//Relation.java
public interface Relation {
public boolean isGreater( Object
a, Object b);
public boolean isLess( Object a,
Object b);
public boolean isEqual( Object a,
Object b);
}
//Line.java
public class Line implements Relation {
private double x1;
private double x2;
private double y1;
private double y2;
public Line(double x1,
double x2, double y1, double y2){
this.x1 = x1;
this.x2 = x2;
this.y1 = y1;
this.y2 = y2;
}
public double getLength(){
double length = Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)* (y2-y1));
return length;
}
public boolean isGreater(
Object a, Object b){
double aLen =
((Line)a).getLength();
double bLen =
((Line)b).getLength();
return (aLen > bLen);
}
public boolean isLess(
Object a, Object b){
double aLen =
((Line)a).getLength();
double bLen =
((Line)b).getLength();
return (aLen < bLen);
}
public boolean isEqual(
Object a, Object b){
double aLen =
((Line)a).getLength();
double bLen =
((Line)b).getLength();
return (aLen == bLen);
}
}
Untuk menggunakan interface dalam keperluan pewarisan
jamak, dapat dilakukan dengan cara mengimplementasikan interface-interface yang bersangkutan, contohnya:
public class Person implements PersonInterface, LivingThing {
//beberapa kode disini
.........................................
.........................................
}
Perbedaan abstract
class dan interface antara lain:
1.
Semua interface
method tidak memiliki body
sedangkan beberapa abstract class dapat
memiliki method dengan implementasi
2.
Sebuah interface
hanya dapat mendefinisikan constant
sedangkan sebuah abstract class
tampak seperti class biasa yang dapat mendeklarasikan variabel
3.
Interface tidak
memiliki hubungan inheritance secara
langsung dengan sebuah class tertentu,
sedangkan abstract class bisa jadi
hasil turunan dari abstract class
induknya
4.
Interface
memungkinkan terjadinya pewarisan jamak (Multiple
inheritance) sedangkan abstract class
tidak