Rumusan Masalah :
1. Apa pengertian dari Pewarisan (Inheritence) pada Java ?
2. Kenapa kita harus menggunakan Pewarisan (Inheritence) pada Java ?
3. Apa manfaat menggunakan Pewarisan (Inheritence) ?
4. Bagaimana Konsep dari Pewarisan (Inheritence) pada Java
5. Studi Kasus Pewarisan Inheritence!
Dengan konsep ini, karakteristik yang dimiliki oleh class binatang cukup didefinisikan dalam
class binatang saja. Class mamalia tidak perlu mendefinisikan ulang apa yang telah dimiliki
oleh class binatang, karena sebagai class turunannya, ia akan mendapatkan karakteristik dari
class binatang secara otomatis. Demikian juga dengan class anjing, kucing dan monyet,
hanya perlu mendefinisikan karakteristik yang spesifik dimiliki oleh class-nya masing-
masing. Dengan memanfaatkan konsep pewarisan ini dalam pemrograman, maka hanya perlu
mendefinisikan karakteristik yang lebih umum akan didapatkan dari class darimana ia
diturunkan.
Manfaat penggunaan konsep pewarisan antara lain:
Kita dapat menggunakan kembali kelas-kelas yang kita buat (sebagai superkelas) dan
membuat kelas-kelas baru berdasar superkelas tersebut dengan karakteristik yang
lebih khusus dari behaviour umum yang dimiliki superkelas.
Kita dapat membuat superkelas yang hanya mendefinisikan behaviour namun tidak
memberi implementasi dari metode-metode yang ada. Hal ini berguna jika kita ingin
membuat semacam template kelas. Kelas semacam ini disebut kelas abstrak, karena
behaviournya masih abstrak dan belum diimplementasikan. Subkelas-subkelas dari
kelas semacam ini, yang disebut kelas konkret, mengimplementasikan behaviour
abstrak tersebut sesuai dengan kebutuhan masing-masing.
Kelas Kucing.java
Kelas kucing merupakan subclass dari kelas Animal, karena itu kelas ini akan mewarisi
atribut dari kelas Animal.
1public class Kucing extends Animal{
2
3 @Override
4 public void mengeluarkanSuara()
5 {
6 System.out.println("Meong");
7 }
8}
Kelas AnimalTest.java
Kelas ini yang berfungsi sebagai driver untuk menjalankan program, atau bisa disebut juga
dengan Main Class. Pada program ini didemokan bahwa walaupun memanggil method yang
sama mengeluarkanSuara() namun ternyata program menghasilkan output yang berbeda
1
2public class AnimalTest
3{
4
5 public static void main(String[] args)
{
6
Animal animal1 = new Animal();
7
animal1.nama = "Binatang Abstrak";
8
animal1.mengeluarkanSuara();
9
10 Kucing kucing1 = new Kucing();
11 kucing1.nama = "Kitten";
12 kucing1.mengeluarkanSuara();
13
14 Animal animal2 = new Kucing();
15 animal2.nama = "Mew";
16
17 }
18
19}
File: Zombie.java
class Zombie {
String name;
int hp;
int attackPoin;
void attack(){
// ...
}
void walk(){
//...
}
}
File: Pocong.java
class Pocong {
String name;
int hp;
int attackPoin;
void attack(){
// ...
}
void jump(){
//...
}
}
File: Burung.java
class Burung {
String name;
int hp;
int attackPoin;
void attack(){
// ...
}
void walk(){
//...
}
void jump(){
//...
}
void fly(){
//...
}
}
File: Enemy.java
class Enemy {
String name;
int hp;
int attackPoin;
void attack(){
System.out.println("Serang!");
}
}
Pada class anak, kita menggunakan kata kunci extends untuk menyatakan kalau dia adalah
class turunan dari Enemy.
File: Zombie.java
class Zombie extends Enemy {
void walk(){
System.out.println("Zombie jalan-jalan");
}
}
File: Pocong.java
class Pocong extends Enemy {
void jump(){
System.out.println("loncat-loncat!");
}
}
File: Burung.java
class Burung extends Enemy {
void walk(){
System.out.println("Burung berjalan");
}
void jump(){
System.out.println("Burung loncat-loncat");
}
void fly(){
System.out.println("Burung Terbang...");
}
}
Lalu, bila kita ingin membuat objek dari class-class tersebut, Kita bisa membuatnya seperti
ini:
Enemy monster = new Enemy();
Zombie zumbi = new Zombie();
Pocong hantuPocong = new Pocong();
Burung garuda = new Burung();
Buka Netbeans, pada Porject yang kemarin, buatlah package baru bernama inheritance di
dalam Source Packages.
float luas(){
System.out.println("Menghitung laus bangun datar");
return 0;
}
float keliling(){
System.out.println("Menghitung keliling bangun datar");
return 0;
}
File: inheritance/Persegi.java
package inheritance;
File: inheritance/Lingkaran.java
package inheritance;
// jari-jari lingkaran
float r;
File: inheritance/PersegiPanjang.java
package inheritance;
File: inheritance/Segitiga.java
package inheritance;
float alas;
float tinggi;
File: inheritance/Main.java
package inheritance;
persegi.luas();
persegi.keliling();
lingkaran.luas();
lingkaran.keliling();
persegiPanjang.luas();
persegiPanjang.keliling();
mSegitiga.luas();
mSegitiga.keliling();
}
}
Setelah itu, coba jalankan class Main, maka hasilnya:
Kenapa hasilnya bisa begitu?
Karena yang kita panggil sebenarnya adalah method luas() dan keliling() milik si induk
(BangunDatar).
Objek anak dari BangunDatar belum memiliki method luas() dan keliling(), akhirnya
mengambil milik induknya.
Lalu bagaimana kalau kita ingin membuat agar semua class anak memiliki
method luas() dan keliling() yang berbeda dari induk?
Jawabanya: menggunakan method overriding.
Method Overriding
Method Overriding dilakukan saat kita ingin membuat ulang sebuah method pada sub-class
atau class anak.
Method Overriding dapat dibuat dengan menambahkan anotasi @Override di atas nama
method atau sebelum pembuatan method.
Contoh: Persegi.java
class Persegi extends BangunDatar {
float sisi;
@Override
float luas(){
float luas = sisi * sisi;
System.out.println("Luas Persegi: " + luas);
return luas;
}
@Override
float keliling(){
float keliling = 4 * sisi;
System.out.println("Keliling Persegi: " + keliling);
return keliling;
}
}
Artinya kita menulis ulang method luas() dan keliling() di class anak.
Sekarang mari kita buat method overriding untuk semua class anak.
File: Lingkaran.java
package inheritance;
// jari-jari lingkaran
float r;
@Override
float luas(){
float luas = (float) (Math.PI * r * r);
System.out.println("Luas lingkaran: " + luas);
return luas;
}
@Override
float keliling(){
float keliling = (float) (2 * Math.PI * r);
System.out.println("Keliling Lingkaran: " + keliling);
return keliling;
}
}
Dalam rumus luas dan keliling lingkaran, kita bisa memanfaatkan konstanta Math.PI sebagai
nilai PI. Konstanta ini sudah ada di Java.
File: PersegiPanjang.Java
package inheritance;
@Override
float luas(){
float luas = panjang * lebar;
System.out.println("Luas Persegi Panjang:" + luas);
return luas;
}
@Override
float keliling(){
float kll = 2*panjang + 2*lebar;
System.out.println("Keliling Persegi Panjang: " + kll);
return kll;
}
}
File: Segitiga.java
package inheritance;
float alas;
float tinggi;
@Override
float luas() {
float luas = 1/2 * (alas * tinggi);
System.out.println("Luas Segitiga: " + luas);
return luas;
}
}
Untuk class Segitiga, kita hanya melakukan override terhadap method luas() saja. Karena
untuk method keliling(), segitiga memiliki rumus yang berbeda-beda.
…atau mungkin bisa diturunkan lagi class segitiga ini
menjadi: SegitigaSiku, SegitigaSamaKaki, SegitigaSamaSisi, dsb.
Sekarang mari kita coba eksekusi class Main lagi:
Tunggu dulu!
Tadi di awal katanya tidak efisien menulis berulang-ulang, lah ini?
Iya di awal kita menulis atribut dari Enemy yang sama berulang-ulang. Berbeda dengan yang
ini, kita memang menulis method yang sama. Tapi isi atau rumus di dalam method-nya
berbeda-beda.
Ini nanti akan kita bahas dalam Polymorfisme (banyak bentuk).