Inheritance (turunan) ada di mana-mana dalam Java. Sangat tidak mungkin membuat aplikasi tanpa melibatkan konsep Inheritance, faktanya setiap class yang kita tulis adalah turunan dari class Object. Anda ingin bukti? Ingat-ingat lagi bab tentang operator, di sana ada satu operator instanceof, operator ini digunakan untuk mengetes apakah sebuah object merupakan tipe dari suatu class. Operator ini akan mengembalikan true kalau tipe dari object tersebut adalah class yang ada di operand sebelah kanan dari operator instanceof, sebaliknya nilainya adalah false. Kita lihat contohnya di bawah ini :
public class InheritanceTest {
public static void main(String[] args){
InheritanceTest test = new InheritanceTest(); if(test instanceof Object) {
System.out.println("test tipenya Object"); } else {
System.out.println("test tipenya bukan Object"); }
} }
Kalau kita compile kode di atas dan dijalankan, outputnya adalah seperti di bawah ini : $ javac InheritanceTest.java
$ java InheritanceTest test tipenya Object $
Terbukti bahwa walaupun tidak secara eksplisit kita defnisikan InheritanceTest sebagai turunan dari Object, faktanya InheritaceTest adalah turunan dari Object karena operator instanceof mengembalikan nilai true ketika object dari InhertanceTest dioperasikan dengan class Object.
Implementasi inheritance dalam kode menggunakan keyword extends. Kalau kita ingin membuat sebuah class turunan dari class yang lain, kita gunakan keyword extends setelah deklarasi nama class diikuti dengan class yang ingin digunakan sebagai orang tua dari class tersebut. Misalnya kita ingin akan membuat dua buah class, class pertama adalah Customer sedangkan class kedua adalah MemberCustomer, dimana class MemberCustomer adalah turunan dari class Customer. Kode class Customer adalah seperti di bawah ini :
public class Customer {}
kode class MemberCustomer adalah seperti di bawah ini public classs MemberCustomer extends Customer {}
Class MemberCustomer dalam hal ini mempunyai hubungan IS-A dengan class Customer. Kalimat lengkapnya adalah “MemberCustomer IS-A Customer”. Hal ini dikarenakan MemberCustomer adalah turunan Customer, analoginya kita bisa menggunakan kucing dan hewan. Kucing adalah turunan dari hewan, maka kucing adalah hewan. Sama juga seperti MemberCustomer adalah turunan dari Customer, maka MemberCustomer adalah Customer. Apa tujuan dari inheritance dilihat dari sisi kode? Yang pertama adalah mempromosikan code reuse, yaitu penggunaan kembali kode yang sudah ditulis. Hal ini dikarenakan, sebagai turunan dari Customer, MemberCustomer akan mempunyai semua sifat-sifat (kode) dari class Customer. Misalnya kita ubah sedikit kode di atas, kita tambahkan property dan method di dalam class Customer :
public class Customer { private Long id;
public void setId(Long aId){ this.id = aId;
}
public Long getId() { return this.id; }
}
kemudian class MemberCustomer tetap seperti semula : public class MemberCustomer extends Customer {} Buat lagi satu class untuk mengetes konsep inheritance :
public class CustomerTest {
public static void main(String[] args) {
MemberCustomer member = new MemberCustomer(); member.setId(100l);
System.out.println("id customer : " + member.getId()); }
Kalau kita compile ketiga class di atas dan dijalankan outputnya adalah sebagai berikut ini : $ javac MemberCustomer.java Customer.java CustomerTest.java
$ java CustomerTest id customer : 100 $
Terlihat bahwa tidak ada error dalam proses kompilasi, padahal class MemberCustomer tidak mendefnisikan apapun, tetapi method setId dan getId dapat digunakan. Hal ini dikarenakan MemberCustomer mengextends Customer, sehingga method setId dan getId diturunkan. Catat juga bahwa property id sendiri tidak diturunkan ke dalam MemberCustomer, karena property id menggunakan private sebagai access modifer.
Hubungan HAS-A lebih sederhana penjelasanya dibanding hubungan IS-A. Hubungan HAS-A atau biasa disebut dengan komposisi (composition) terjadi kalau sebuah class mempunyai sebuah property. Misalnya kita bisa melihat dalam kode di atas Customer HAS-A Long dengan nama id. Kita akan membuat sebuah satu buah class lagi dengan nama Address, class ini akan digunakan oleh class Customer untuk mendefnisikan alamat Customer. Kodenya seperti di bawah ini :
public class Address { private String street; private String city; private String postCode; }
Hubungan antara Customer dan Address adalah HAS-A, diimplementasikan dengan membuat property di dalam class Customer dengan tipe Address. Kita ubah sedikit kode dari class Customer di atas menjadi seperti di bawah ini :
public class Customer { private Long id;
private Address address; public void setId(Long aId){ this.id = aId;
}
public Long getId() { return this.id; }
public void setAddress(Address aAddress) { this.address = aAddress;
}
public Address getAddress() { return this.address;
} }
Kode di atas memperlihatkan hubungan Customer HAS-A Address.
Manfaat kedua dari inheritance adalah polimorfsme, kita akan membahas tentang polimorfsme di bab di bawah ini.
Polimorisme (Polymorphism)
Arti polimorfsme secara harfah (makna kata) adalah banyak bentuk. Sebuah object bisa diassign ke dalam tipe yang berbeda-beda. Contohnya MemberCustomer, class MemberCustomer IS-A :
• Object, karena semua class pasti extends Object
• Customer, karena MemberCustomer extends Customer
• MemberCustomer
Jadi kalau ada variabel dengan tipe Object, Customer atau MemberCustomer bisa diassign dengan instance dari MemberCustomer. Contohnya seperti di bawah ini :
Customer c = new MemberCustomer();
MemberCustomer mc = new MemberCustomer(); Object object = mc;
Customer cust = mc;
Interface juga bisa digunakan dalam skenario IS-A ini, misalnya untuk class MemberCustomer bisa mengimplementasikan sebuah interface, kemudian interface ini bisa digunakan sebagai tipe variabel yang bisa diassign dengan instance dari MemberCustomer. Class MemberCustomer akan kita ubah sedikit seprti berikut ini :
public class MemberCustomer extends Customer implements Serializable {}
Sekarang kita bisa mendeklarasikan variabel dengan tipe Serializable dan mengassign instance dari MemberCustomer ke dalam variabel tersebut. Atau dengan kata lain MemberCustomer IS-A Serialiable, seperti contoh di bawah ini :
Serializable s = new MemberCustomer();
Jadi MemberCustomer mempunyai banyak bentuk (polimorfsme). Kita akan sering melihat kode dengan pola seperti ini, variabel akan dideklarasikan dengan tipe interface tetapi diinstansiasi dengan class yang mengimplementasikan interface tersebut. Praktek seperti ini dikategorikan sebagai praktek yang baik sehingga banyak diikuti oleh developer Java.