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, sepertijumlahRoda
ataukecepatanMaksimal
.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 membuatPesawat
sertaBurung
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 metodeterbang()
.Jadi,
class Pesawat implements BisaTerbang
danclass 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
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 dariabstract 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