Abstract Class VS Interface

Perbedaan utamanya adalah tentang identitas ("is-a") versus kemampuan ("can-do").

  • Abstract Class mendefinisikan identitas dasar dari sebuah objek. Ini adalah "cetak biru" yang belum lengkap untuk sebuah keluarga objek yang berhubungan erat.

  • Interface mendefinisikan sebuah kemampuan atau kontrak. Ini adalah "sertifikasi keahlian" yang bisa dimiliki oleh objek apa pun, tidak peduli dari keluarga mana ia berasal.


## Analogi Sederhana

Bayangkan kita ingin membuat model berbagai hal di dunia nyata.

1. Abstract Class: Kendaraan 🚗

Kita bisa membuat abstract class Kendaraan. Kenapa abstrak? Karena tidak ada objek "Kendaraan" generik di dunia nyata; yang ada adalah Mobil, Motor, atau Truk.

  • Sebuah abstract class Kendaraan bisa punya variabel/status yang sama untuk semua turunannya, seperti jumlahRoda atau kecepatanMaksimal.

  • Ia bisa punya metode yang sudah ada isinya (konkret), seperti nyalakanMesin(), karena cara menyalakan mesin mungkin sama untuk semua kendaraan.

  • Ia juga punya metode yang wajib diisi oleh turunannya (abstrak), seperti caraMengemudi(), karena cara mengemudikan mobil dan motor itu berbeda.

Di sini, hubungan Mobil dengan Kendaraan sangat kuat. Sebuah Mobil adalah sebuah Kendaraan (Mobil is-a Kendaraan). Mereka berada dalam satu "pohon keluarga" yang sama. 👨‍👩‍👧‍👦

2. Interface: BisaTerbang 🕊️

Sekarang, bayangkan kemampuan untuk terbang. Banyak hal yang bisa terbang, tapi mereka tidak berhubungan satu sama lain: Pesawat, Burung, Lebah, bahkan Superman.

  • Kita tidak bisa membuat abstract class BisaTerbang dan membuat Pesawat serta Burung menjadi turunannya. Mereka adalah entitas yang fundamentally berbeda!

  • Sebagai gantinya, kita membuat interface BisaTerbang yang berisi kontrak: siapa pun yang mengklaim bisa terbang harus punya metode terbang().

  • Jadi, class Pesawat implements BisaTerbang dan class Burung implements BisaTerbang.

Di sini, hubungannya adalah tentang kemampuan. Sebuah Pesawat bisa melakukan terbang (Pesawat can-do fly). Interface adalah seperti memberikan "sertifikat" atau "lencana kemampuan" pada sebuah class. 📜


## Perbandingan Teknis

Fitur
Abstract Class
Interface

Tujuan Utama

Berbagi kode dan identitas dalam satu keluarga kelas (is-a).

Mendefinisikan kontrak kemampuan untuk kelas mana pun (can-do).

Kata Kunci

Class anak menggunakan extends.

Class menggunakan implements.

Pewarisan

Sebuah class hanya bisa extends SATU abstract class.

Sebuah class bisa implements BANYAK interface.

Variabel

Bisa punya segala jenis variabel (instance variables, static, final).

Hanya bisa punya variabel public static final (konstanta).

Metode

Bisa punya metode abstrak (tanpa isi) dan konkret (dengan isi).

Dulu hanya metode abstrak. Sejak Java 8, bisa punya metode default dan static (dengan isi).

Konstruktor

Punya konstruktor (dipanggil oleh konstruktor class anak).

Tidak punya konstruktor.


## Kapan Harus Pakai yang Mana?

Gunakan Abstract Class jika:

  • Anda ingin berbagi kode (metode konkret) atau status (variabel) di antara beberapa kelas yang sangat berhubungan erat.

  • Kelas-kelas tersebut mewakili "keluarga" yang sama (contoh: Kucing, Anjing, Singa adalah turunan dari abstract class Mamalia).

  • Anda ingin menyediakan implementasi dasar yang bisa digunakan atau di-override oleh kelas anak.

Gunakan Interface jika:

  • Anda ingin mendefinisikan sebuah peran atau kemampuan yang bisa dimiliki oleh kelas-kelas yang tidak berhubungan (contoh: Serializable, Comparable, Runnable).

  • Anda ingin sebuah class memiliki lebih dari satu "tipe" perilaku (karena class bisa implementasi banyak interface).

  • Anda ingin mendefinisikan kontrak API yang jelas tanpa membocorkan detail implementasi sama sekali.

Singkatnya: Pilih abstract class untuk identitas dan kode bersama. Pilih interface untuk kontrak kemampuan.

Last updated