Praktikum PBO

Inheritance

Konsep pewarisan sifat antar Class untuk menghindari kode berulang (DRY).

1. Pengantar & Analogi Dunia Nyata

Pernah dengar istilah DRY (Don't Repeat Yourself)? Di dunia pemrograman, menulis kode yang sama berulang-ulang itu "dosa besar". Kalau ada bug, kamu harus memperbaikinya di banyak tempat sekaligus. Ribet kan?

Nah, Inheritance (Pewarisan) adalah solusinya. Bayangkan ada dua tipe mahasiswa:

  1. Mahasiswa Biasa: Kegiatannya Kuliah, Nugas, Tidur.
  2. Mahasiswa Organisasi (Aktivis): Dia juga melakukan hal yang sama (Kuliah, Nugas, Tidur), TAPI dia punya tambahan tugas: Rapat dan Bikin Proker.

Daripada kita membuat kodingan untuk ActivistStudent dari nol dan menulis ulang fungsi study dan sleep, lebih baik kita warisi saja sifat-sifat dari Student.

2. Konsep Teknis

Inheritance memungkinkan sebuah Class (disebut Child Class atau Subclass) untuk mengambil alih semua atribut dan method dari Class lain (disebut Parent Class atau Superclass).

Dengan inheritance, kita mendapatkan keuntungan:

  1. Reusability: Kode yang sudah ditulis di Parent bisa dipakai ulang di Child.
  2. Extensibility: Child bisa menambahkan fitur baru tanpa mengubah Parent.
  3. Hierarchy: Menciptakan struktur hubungan "is-a" (Activist is a Student).

The "Object" Class

Di Java, sebenarnya SEMUA class yang kamu buat itu otomatis mewarisi sebuah class mbah buyut bernama Object (java.lang.Object), meskipun kamu tidak menulis extends Object. Inilah kenapa setiap object pasti punya method bawaan seperti toString(), equals(), dan hashCode().

Kata kunci utamanya adalah extends.

3. Komponen Utama

A. Parent Class (Superclass)

Class induk yang memberikan warisan. Berisi atribut dan method umum yang dimiliki oleh semua turunannya.

  • Contoh: Student (punya nama, method study()).

B. Child Class (Subclass)

Class anak yang menerima warisan. Dia bisa:

  1. Menggunakan atribut/method dari Parent.
  2. Menambahkan atribut/method baru miliknya sendiri.
  3. Mengubah (Override) perilaku Parent.

Single Inheritance

Di Java, sebuah Class hanya bisa mewarisi SATU Parent Class. Kamu tidak bisa menulis class Child extends Father, Mother.

C. super Keyword (Constructor Chaining)

Saat Child Class dibuat (new ActivistStudent()), Java punya aturan ketat: Parent harus "hidup" dulu sebelum Child. Maka, baris pertama di Constructor Child WAJIB memanggil Constructor Parent menggunakan super().

Logika Constructor Chaining

Bayangkan seperti membangun rumah tingkat 2 (Child). Kamu wajib membangun lantai 1 (Parent) dulu sebagai fondasi. Tidak mungkin lantai 2 melayang tanpa lantai 1.

D. Access Modifier protected

Spesial untuk Inheritance, ada modifier protected.

  • Private: Cuma class itu sendiri.
  • Protected: Class itu sendiri + Semua Child Class (walaupun beda package). Ini adalah "Rahasia Keluarga" yang boleh diketahui oleh anak-cucu.

4. Studi Kasus Koding (Java)

Mari kita buat hierarki Student dan ActivistStudent dengan gaya koding Hybrid (Metode Bahasa Inggris, Variabel Bahasa Indonesia).

File 1: Student.java (Parent)

public class Student {
    // Gunakan 'protected' agar bisa diakses langsung oleh Anak (ActivistStudent)
    protected String nama;
    protected String nim;

    // Constructor
    public Student(String nama, String nim) {
        System.out.println("  [Parent] Membuat Student baru...");
        this.nama = nama;
        this.nim = nim;
    }

    // Method Umum
    public void study() {
        System.out.println(nama + " sedang belajar dengan giat.");
    }

    public void sleep() {
        System.out.println(nama + " sedang tidur nyenyak (zzz)...");
    }
}

File 2: ActivistStudent.java (Child)

// "extends Student" artinya: ActivistStudent MEWARISI semua milik Student
public class ActivistStudent extends Student {
    
    // Atribut KHUSUS (cuma dimiliki aktivis)
    private String namaOrganisasi;

    public ActivistStudent(String nama, String nim, String namaOrganisasi) {
        // STEP 1: Panggil Constructor Parent dulu (Lantai 1)
        super(nama, nim); 
        
        // STEP 2: Baru urus atribut sendiri (Lantai 2)
        System.out.println("  [Child] Menambahkan atribut Activist...");
        this.namaOrganisasi = namaOrganisasi;
    }

    // Method KHUSUS
    public void leadMeeting() {
        System.out.println(nama + " sedang memimpin rapat untuk organisasi " + namaOrganisasi);
    }
}

File 3: Main.java (Eksekusi)

public class Main {
    public static void main(String[] args) {
        System.out.println("--- 1. Buat Mahasiswa Biasa ---");
        Student mhsBiasa = new Student("Budi", "101");
        
        System.out.println("\n--- 2. Buat Ketua BEM (Activist) ---");
        // Perhatikan urutan output Constructor!
        ActivistStudent ketuaBEM = new ActivistStudent("Reza", "102", "BEM Universitas");

        System.out.println("\n--- Aksi Ketua BEM ---");
        // Dia bisa melakukan apa yang mhs biasa lakukan (WARISAN)
        ketuaBEM.study();  
        // Output: Reza sedang belajar dengan giat.
        
        ketuaBEM.sleep();  
        // Output: Reza sedang tidur nyenyak (zzz)...

        // DAN dia bisa melakukan tugas khususnya
        ketuaBEM.leadMeeting(); 
        // Output: Reza sedang memimpin rapat untuk organisasi BEM Universitas
    }
}

5. Bedah Kode

  1. extends Student: Ini mantra ajaibnya. ActivistStudent otomatis punya variabel nama, nim, serta method study() dan sleep() tanpa perlu kita tulis ulang.
  2. protected: Kita mengubah access modifier atribut di Parent menjadi protected agar bisa diakses langsung oleh Child Class, tapi tetap aman dari dunia luar.
  3. super(nama, nim): Constructor anak wajib memanggil constructor bapaknya dulu. Lihat output program: [Parent] Membuat Student baru... akan muncul sebelum [Child] Menambahkan atribut....
  4. ketuaBEM.study(): Walaupun di file ActivistStudent.java tidak ada tulisan method study, kode ini tetap jalan karena dia mewarisi dari Student.

6. Latihan

Sebuah game simulasi hewan membutuhkan berbagai jenis hewan dengan perilaku unik. Kamu diminta membuat sistem pewarisan dasar untuk hewan-hewan tersebut.

Buatlah dua class dengan hubungan Inheritance:

1. Class Animal (Parent)

  • Attribute: protected String nama
  • Constructor: Menerima nama dan menyimpannya.
  • Method:
    • makeSound(): Cetak <nama> bersuara: ... (Default)
    • eat(): Cetak <nama> sedang makan.

2. Class Dog (Child extends Animal)

  • Constructor: Menerima nama, wajib memanggil constructor parent (super).
  • Override Method:
    • makeSound(): Ubah output menjadi <nama> bersuara: Guk guk!
  • Method Baru:
    • fetch(): Cetak <nama> sedang mengambil bola!

Output yang Diharapkan

Buddy bersuara: Guk guk!
Buddy sedang mengambil bola!
Buddy sedang makan.
Main.java

7. Kesimpulan

Inheritance bikin kode kamu:

  • Lebih Ringkas: Gak perlu copy-paste method umum.
  • Mudah Di-maintain: Kalau mau ubah cara study(), cukup ubah di Parent, semua anak otomatis mengikuti perubahannya.

Selanjutnya, kita akan belajar gimana kalau anaknya pengen punya cara belajar yang beda dari bapaknya? Itu namanya Polymorphism.

On this page