Pewarisan & Polimorfisme

extends, super, override, polimorfisme, upcasting/downcasting, instanceof, final, dan kapan memakai komposisi.

Part 8 dari 17 ± 60 menit Gratis

Pewarisan (inheritance)

Pewarisan memungkinkan sebuah class (subclass/anak) memakai ulang field dan method dari class lain (superclass/induk) memakai kata kunci extends. Hubungannya adalah "adalah sebuah" (is-a): Kucing adalah Hewan.

class Hewan {
    protected String nama;

    public Hewan(String nama) {
        this.nama = nama;
    }

    public void bersuara() {
        System.out.println(nama + " bersuara");
    }
}

class Kucing extends Hewan {
    public Kucing(String nama) {
        super(nama);          // panggil constructor induk
    }

    @Override
    public void bersuara() {
        System.out.println(nama + ": meong!");
    }
}

class Anjing extends Hewan {
    public Anjing(String nama) {
        super(nama);
    }

    @Override
    public void bersuara() {
        System.out.println(nama + ": guk guk!");
    }
}
  • super(...) memanggil constructor induk dan harus menjadi baris pertama constructor anak.
  • Java hanya mendukung satu induk langsung (tidak ada pewarisan ganda untuk class).
  • Anak mewarisi member public/protected; member private tetap tersembunyi.

Override

Override = anak menulis ulang method induk dengan tanda tangan (nama + parameter) yang sama. Selalu tambahkan anotasi @Override: jika kamu salah ketik nama method, compiler langsung memberi error. Dari dalam override, super.bersuara() memanggil versi induk.

Bedakan: overload = nama sama, parameter beda (satu class); override = tanda tangan sama, di subclass.

Polimorfisme

Polimorfisme ("banyak bentuk"): variabel bertipe induk boleh menunjuk objek anak, dan method yang dijalankan ditentukan oleh objek sebenarnya saat program berjalan.

Hewan[] kandang = { new Kucing("Tom"), new Anjing("Rex"), new Hewan("Umum") };
for (Hewan h : kandang) {
    h.bersuara();     // pilih versi sesuai objek aslinya
}
// Tom: meong!
// Rex: guk guk!
// Umum bersuara

Kekuatannya: kode yang memproses Hewan tidak perlu tahu jenis persisnya, dan kamu bisa menambah jenis hewan baru tanpa mengubah loop di atas (prinsip open/closed).

Upcasting, downcasting, instanceof

Hewan h = new Kucing("Tom");     // upcasting (otomatis, aman)
if (h instanceof Kucing) {
    Kucing k = (Kucing) h;        // downcasting (manual, bisa gagal)
}
// Java 16+: pattern matching
if (h instanceof Kucing k) {
    System.out.println(k.nama);
}

Dengan variabel bertipe Hewan, kamu hanya bisa memanggil method yang dikenal Hewan, walau objek aslinya Kucing. Downcast yang salah melempar ClassCastException, jadi periksa dulu dengan instanceof.

Class Object

Semua class otomatis turunan Object, itulah sebabnya semua objek punya toString(), equals(), dan hashCode() yang bisa di-override.

final

  • final class X — tidak boleh diwarisi (contoh: String).
  • final void m() — tidak boleh di-override.
  • final int x — nilainya tidak boleh diubah setelah diisi.

Komposisi vs pewarisan

Pewarisan mengikat anak erat dengan induk. Gunakan hanya jika hubungan is-a benar-benar berlaku. Jika hubungannya has-a (Mobil punya Mesin), pakai komposisi: simpan objek lain sebagai field. Prinsip populer: "favor composition over inheritance".

class Mesin { void nyalakan() { System.out.println("Brum"); } }
class Mobil {
    private final Mesin mesin = new Mesin();
    void jalan() { mesin.nyalakan(); }
}

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X