author Ahmad Muhardian

Belajar Java OOP: Memahami Inheritance dan Method Overriding


Java Oop Inheritance

Seperti yang sudah kita pelajari pada tulisan sebelumnya: sebuah class atau objek bisa saling berhubungan dengan class yang lain.

Salah satu bentuk hubungannya adalah inheritance (pewarisan). Hubungan ini seperti hubungan keluarga antara orang tua dan anak.

Sebuah class di Java, bisa memiliki satu atau lebih keturunan atau class anak. Class anak akan memiliki warisan properti dan method dari class ibu.

Pada tutorial ini kita akan belajar:

  1. Kenapa kita harus menggunakan inheritance?
  2. Contoh Program inheritance
  3. Method Overriding

Mari kita mulai…

Kenapa Kita Harus Menggunakan Inheritance?

Misalkan dalam Game, kita akan membuat class-class musuh dengan perilaku yang berbeda.

Class-Class Musuh

Lalu kita membuat kode untuk masing-masing kelas seperti ini:

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(){
        //...
    }
}

Apakah boleh seperti ini?

Ya, boleh-boleh saja. Akan Tapi tidak efektif, karena kita menulis berulang-ulang properti dan method yang sama.

Bagaimana solusinya?

Kita harus menggunakan inheritance.

Mari kita lihat memeber class yang sama:

Class-Class Musuh

Setelah menggunakan inheritance, maka akan menjadi seperti ini:

Class-Class Musuh

Oya, inheritance di StarUML digambarkan dengan garis hubung Generalization.

Class Enemy adalah class induk yang memiliki anak Zombie, Pocong, dan Burung. Apapun properti yang ada di class induk, akan dimiliki juga oleh class anak.

Lalu bagaimana bentuk kodenya dalam Java?

Bentuk kodenya akan seperti ini:

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();

Contoh Program Inheritance

Setelah memahami konsep inheritance, sekarang mari kita buat contoh program sederhana.

Program yang akan kita buat untuk berfungsi untuk menghitung luas dan keliling bangun datar.

Bentuk class diagramnya seperti ini:

Class BangunDatar

Baik, mari kita buat semua class-class-nya.

Buka Netbeans, pada Porject yang kemarin, buatlah package baru bernama inheritance di dalam Source Packages.

Membuat Package Baru di netbeans

Isi nama package dengan inheritance.

Membuat Package Baru di netbeans

Berikutnya buatlah class-class baru berdasarkan diagram di atas.

File: inheritance/BangunDatar.java

package inheritance;

public class BangunDatar {
    
    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;

public class Persegi extends BangunDatar {
    float sisi;   
}

File: inheritance/Lingkaran.java

package inheritance;

public class Lingkaran extends BangunDatar{
    
    // jari-jari lingkaran
    float r;
    
}

File: inheritance/PersegiPanjang.java

package inheritance;

public class PersegiPanjang extends BangunDatar {
    float panjang;
    float lebar;
}

File: inheritance/Segitiga.java

package inheritance;

public class Segitiga extends BangunDatar {
    
    float alas;
    float tinggi;
    
}

File: inheritance/Main.java

package inheritance;

public class Main {
    public static void main(String[] args) {
        
        // membuat objek bangun datar
        BangunDatar bangunDatar = new BangunDatar();
        
        // membuat objek persegi dan mengisi nilai properti
        Persegi persegi = new Persegi();
        persegi.sisi = 2;
        
        // membuat objek Lingkaran dan mengisi nilai properti
        Lingkaran lingkaran = new Lingkaran();
        lingkaran.r = 22;
        
        // membuat objek Persegi Panjang dan mengisi nilai properti
        PersegiPanjang persegiPanjang = new PersegiPanjang();
        persegiPanjang.panjang = 8;
        persegiPanjang.lebar = 4;
        
        // membuat objek Segitiga dan mengisi nilai properti
        Segitiga mSegitiga = new Segitiga();
        mSegitiga.alas = 12;
        mSegitiga.tinggi = 8;
        
        
        // memanggil method luas dan keliling
        bangunDatar.luas();
        bangunDatar.keliling();
        
        persegi.luas();
        persegi.keliling();
        
        lingkaran.luas();
        lingkaran.keliling();
        
        persegiPanjang.luas();
        persegiPanjang.keliling();
        
        mSegitiga.luas();
        mSegitiga.keliling();
    }
}

Setelah itu, coba jalankan class Main, maka hasilnya:

Hasil Eksekusi Program Inheritance

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;

public class Lingkaran extends BangunDatar{
    
    // 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;

public class PersegiPanjang extends BangunDatar {
    float panjang;
    float lebar;
    
    @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;

public class Segitiga extends BangunDatar {
    
    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:

Hasil Eksekusi Program Inheritance Override

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).

Akhir Kata…

Inheritance adalah salah satu pilar penting dalam OOP yang harus dipahami. Karena kita akan sering menggunakannya dalam pembuatan program.

Selanjutnya silahkan perlajari tentang hak akses member (modifier).

Atau kembali ke indeks tutorial Java

Baca Juga ini

Belajar Java OOP: Memahami Konsep Dasar OOP (untuk Pemula)

Belajar Java OOP: Memahami Konsep Dasar OOP (untuk Pemula)

Pengantar Konsep dasar OOP untuk Pemula. OOP merupakan hal yang harus dipelajari untuk memahami Java lebih dalam. Jika kamu ingin memahami Framework, pelajari dulu konsep OOP

Cara Menggunakan Maven pada Proyek Aplikasi Java

Cara Menggunakan Maven pada Proyek Aplikasi Java

Tutorial ini akan menjelaskan cara menggunakan Maven untuk mengelola project Java. Dimulai dari instalasi Maven, install library, hingga melakukan Unit Testing dengan JUnit

Tutorial Java dan MySQL: Membuat Program CRUD Berbasis Teks

Tutorial Java dan MySQL: Membuat Program CRUD Berbasis Teks

Cara Menghubungkan Java dengan MySQL dan Membuat Program CRUD

Kenapa Bahasa Pemrograman Java Kurang Cocok untuk Pemula?

Kenapa Bahasa Pemrograman Java Kurang Cocok untuk Pemula?

Sudah dua kali semester saya mengajar di praktikum pemrograman Java. Hasilnya, hanya sebagian mahasiswa yang mengerti. Sebagiannya lagi masih pusing (atau mungkin saya yang tidak bisa mengajar). Bahasa pemrograman Java memang populer dan banyak digunakan di lapangan, oleh karena itu pihak kampus memilih bahasa ini untuk diajarkan pada semester I. Bapak Endy Muhardin, dalam tulisan di blognya yang berjudul Java: Tidak untuk Pemula mengatakan: “Java memang bahasa yang mature.

Trik Agar Jendela JFrame Selalu Tampil di Tengah Layar

Trik Agar Jendela JFrame Selalu Tampil di Tengah Layar

googletag.cmd.push(function () { googletag.display('div-gpt-ad-multibanner1'); }); Saat kita membuat program GUI dengan Swing, jendelanya sering tampil pada pojok kiri atas atau pada titik (0,0). Bagaimana caranya agar jendela selalu tampil di tengah-tengah layar? Apakah kita harus mengatur manual posisi titiknya? Ya perlu, untuk lebih jelasnya mari kita bahas… Class-class yang dibutuhkanAda dua class yang kita butuhkan untuk membuat jendela JFrame tampil di tengah-tengah. Dimension untuk membuat objek dimensi Toolkit untuk mengambil ukuran layar Kedua class tersebut berada dalam package java.

Menghitung Akar Kuadrat dan Akar Kubik dengan Java

Menghitung Akar Kuadrat dan Akar Kubik dengan Java

Pada pelajaran Matematika, kadang kita sering menemukan perhitungan akar. Contoh, akar kuadrat dari 25 adalah 5, karena 5x5=25, bisa ditulis: $\sqrt{25} = 5$. Lalu kalau akar kubik dari 27 adalah 3, karena 3x3x3=27, bisa ditulis: $\sqrt[3]{27} = 3$. Bagaimana cara kita membuat perhitungan tersebu di Java? Perhitungan akar kuadrat dapat dilakukan dengan fungsi sqrt(). Fungsi ini terdapat dalam class Math. Jadi untuk menghitung akar seperti di atas dalam kode java dapat dilakukan dengan cara berikut ini: