Polimorfisme di Java: Panduan Lengkap dengan Contoh Praktis
Apa Itu Polimorfisme di Java?
Polimorfisme adalah konsep inti dalam Pemrograman Berorientasi Objek (OOP) Java. Ini timbul ketika kelas terhubung melalui warisan, memungkinkan satu antarmuka untuk mewakili berbagai bentuk yang berbeda. Hasilnya, pemanggilan metode dapat memanggil implementasi yang berbeda tergantung pada tipe objek sebenarnya pada waktu proses.
Bayangkan ponsel pintar yang dapat berkomunikasi melalui panggilan suara, teks, gambar, atau email. Tujuannya—komunikasi—sama, tetapi setiap mode berperilaku berbeda. Itulah polimorfisme dalam istilah sehari-hari.
Apa yang Akan Anda Pelajari
- Definisi polimorfisme Java
- Contoh OOP praktis
- Metode overriding
- Overloading vs. overriding
- Polimorfisme dinamis (run-time)
- Polimorfisme statis vs. dinamis
- Kata kunci
super
Contoh Polimorfisme Java dalam OOP
Pertimbangkan kelas dasar Account yang menawarkan deposit() dan withdraw(). Dua subclass, SavingsAccount dan CheckingAccount, mewarisi metode ini tanpa perubahan karena operasi identik.

Mengadaptasi Persyaratan yang Berubah
Saat fitur baru—seperti fasilitas overdraft—diperlukan, subclass PrivilegedAccount dapat mengganti withdraw() untuk memberikan logika baru tanpa menyentuh subclass yang ada. Ini menunjukkan keuntungan pemeliharaan polimorfisme.

Metode Overriding di Java
Overriding terjadi ketika subclass menyediakan implementasinya sendiri dari metode yang sudah didefinisikan di superclass-nya. Tanda tangan metode (nama, parameter, tipe kembalian) harus cocok persis.
Aturan Utama
- Metode yang diganti dapat memiliki visibilitas yang lebih luas (misalnya,
protected ke public) tetapi tidak pernah lebih sempit. - Tipe kembalian harus sama atau kovarian.
Contoh:
class Doctor { public void treatPatient() { // logika pengobatan umum } } class Surgeon extends Doctor { @Override public void treatPatient() { // pengobatan bedah spesialis } } public class Run { public static void main(String[] args) { Doctor doctor = new Doctor(); doctor.treatPatient(); // mengeksekusi Doctor.treatPatient() Surgeon surgeon = new Surgeon(); surgeon.treatPatient(); // mengeksekusi Surgeon.treatPatient() } } Overloading vs. Overriding
| Metode Overloading | Metode Overriding |
| Kelas yang sama, nama yang sama, daftar parameter berbeda. | Metode superclass didefinisikan ulang di subclass dengan tanda tangan identik. |
Contoh:void sum(int a, int b); void sum(int a, int b, int c); void sum(float a, double b); | Contoh:class X { int sum() { ... } } class Y extends X { @Override int sum() { ... } } |
Polimorfisme Dinamis (Run-Time)
Saat referensi superclass menunjuk ke objek subclass, JVM menyelesaikan pemanggilan metode pada waktu proses. Ini adalah polimorfisme sejati dalam aksi.
Doctor doc = new Surgeon(); doc.treatPatient(); // Mengeksekusi Surgeon.treatPatient()
Metode yang sebenarnya dipanggil tergantung pada tipe objek pada waktu proses, bukan tipe referensi.
Polimorfisme Statis vs. Dinamis
Polimorfisme statis (overloading) diselesaikan pada waktu kompilasi, sementara polimorfisme dinamis (overriding) diselesaikan pada waktu proses.
| Polimorfisme Statis | Polimorfisme Dinamis |
| Metode overloading; binding waktu kompilasi. | Metode overriding; binding waktu proses. |
Contoh:void sum(int a, int b); void sum(float a, double b); | Contoh:Doctor d = new Surgeon(); d.treatPatient(); |
Menggunakan Kata Kunci super
Saat subclass perlu memperluas metode superclass, super memanggil implementasi induk sebelum menambahkan logika sendiri.
class Surgeon extends Doctor { @Override public void treatPatient() { super.treatPatient(); // logika dasar // logika spesialis bedah } } Demikian pula, super dapat mengakses bidang protected atau public dari superclass.
Contoh Praktis: Warisan, Polimorfisme, & Super
Salin kode di bawah ini ke IDE Anda dan amati keluaran.
public class Test { public static void main(String[] args) { X x = new X(); Y y = new Y(); y.m2(); // Buat komentar untuk melihat efek warisan // x.m1(); // y.m1(); // x = y; // referensi induk ke objek anak // x.m1(); // y.a = 10; // error: a adalah private } } class X { private int a; int b; public void m1() { System.out.println("Ini adalah metode m1 dari kelas X"); } } class Y extends X { int c; @Override public void m1() { System.out.println("Ini adalah metode m1 dari kelas Y"); } public void m2() { super.m1(); System.out.println("Ini adalah metode m2 dari kelas Y"); } } Poin Utama
- Polimorfisme memungkinkan objek untuk mengambil beberapa bentuk melalui warisan.
- Metode overriding mengubah perilaku di subclass sambil mempertahankan tanda tangan yang sama.
- Polimorfisme dinamis menyelesaikan pemanggilan metode pada waktu proses, memungkinkan kode yang fleksibel.
- Polimorfisme statis (overloading) adalah waktu kompilasi, sementara polimorfisme dinamis adalah waktu proses.
- Kata kunci
super memungkinkan subclass untuk memanggil metode induk atau mengakses anggota protected.