Polymorphism
Satu nama, banyak bentuk. Konsep Overloading dan Overriding dalam Java.
1. Pengantar & Analogi Dunia Nyata
Polymorphism berasal dari bahasa Yunani yang artinya "Banyak Bentuk". Intinya: Satu perintah (nama method sama), tapi aksinya bisa beda-beda tergantung konteksnya.
Analogi Kampus
-
Makan (Overloading):
- Kalau kamu disuruh "Makan!" tanpa embel-embel, kamu mungkin makan nasi warteg (Default).
- Tapi kalau dibilang "Makan Steak!", jelas kamu makan Steak.
- Satu kata "Makan", tapi beda parameter (menu) hasilnya beda.
-
Presentasi (Overriding):
- Dosen menyuruh "Presentasi!".
- Mahasiswa Baru (Maba): Presentasi baca teks slide plek-ketiplek.
- Mahasiswa Tingkat Akhir: Presentasi demo aplikasi langsung tanpa slide.
- Perintahnya SAMA ("Presentasi"), tapi cara kerjanya BEDA tergantung siapa yang melakukannya.
2. Konsep Teknis
Polymorphism dibagi menjadi dua jenis utama:
| Fitur | Overloading (Compile-time) | Overriding (Runtime) |
|---|---|---|
| Lokasi | Satu Class yang sama | Parent & Child Class |
| Nama Method | Sama | Sama |
| Parameter | HARUS Beda (Jumlah/Tipe) | HARUS Sama |
| Return Type | Boleh beda | Harus sama / kompatibel |
| Keyword | Tidak ada khusus | @Override (Disarankan) |
Upcasting (Kekuatan Sebenarnya)
Pernah lihat kode seperti ini?
Student maba = new Freshman();
Ini disebut Upcasting. Kita membungkus object Anak (Freshman) ke dalam wadah Bapak (Student).
Meskipun wadahnya Student, tapi isinya tetap Freshman.
Kenapa berguna?
Bayangkan kamu punya Array Student[] yang isinya campuran: ada Freshman, Senior, dan Student biasa. Kita bisa meloop semuanya dan memanggil method yang sama (doPresentation), dan masing-masing akan bereaksi sesuai jati dirinya!
3. Komponen Utama
A. Overloading (Satu Class)
Membuat beberapa method dengan nama yang sama di dalam satu class, asalkan parameternya berbeda. Compiler membedakannya saat compile-time.
B. Overriding (Parent-Child)
Child Class menulis ulang (menimpa) implementasi method yang sudah ada di Parent Class agar sesuai dengan kebutuhan spesifik Child tersebut.
Dynamic Binding
Pada Overriding, Java menentukan method mana yang dipanggil saat program berjalan (Runtime) berdasarkan object aslinya (new Freshman() atau new Senior()), bukan berdasarkan tipe variabelnya (Student).
4. Studi Kasus Koding (Java)
Mari kita lihat implementasi keduanya dengan gaya Hybrid.
File 1: Student.java (Parent + Overloading)
public class Student {
// --- OVERLOADING (Beda Parameter) ---
// 1. Default (Tanpa Parameter)
public void eat() {
System.out.println("Makan Indomie karena akhir bulan.");
}
// 2. Custom (Ada Parameter)
public void eat(String namaMakanan) {
System.out.println("Makan " + namaMakanan + " karena baru dapat beasiswa!");
}
// --- BASE METHOD UNTUK OVERRIDING ---
public void doPresentation() {
System.out.println("Mahasiswa melakukan presentasi standar.");
}
}File 2: Freshman.java & Senior.java (Child + Overriding)
// KELAS MABA (Anak Baru)
public class Freshman extends Student {
// MENIMPA method bapaknya
@Override
public void doPresentation() {
System.out.println("Maba: Membaca teks dari slide kata demi kata... (Gugup)");
}
}
// KELAS KATING (Senior)
public class Senior extends Student {
// MENIMPA dengan gaya beda
@Override
public void doPresentation() {
System.out.println("Senior: Demo koding langsung tanpa slide kayak pro! (Santuy)");
}
}File 3: Main.java (Eksekusi)
public class Main {
public static void main(String[] args) {
// 1. TEST OVERLOADING (Satu Object, Beda Perintah)
System.out.println("--- Overloading ---");
Student budi = new Student();
budi.eat();
// Output: Makan Indomie karena akhir bulan.
budi.eat("Wagyu A5");
// Output: Makan Wagyu A5 karena baru dapat beasiswa!
// 2. TEST OVERRIDING & POLYMORPHISM (Upcasting)
System.out.println("\n--- Overriding & Polymorphism ---");
// Kita tampung semua jenis mahasiswa dalam satu Array 'Student'
Student[] daftarMahasiswa = {
new Student(),
new Freshman(),
new Senior()
};
// Loop dan suruh mereka semua presentasi
for (Student s : daftarMahasiswa) {
System.out.println("----------------");
// Satu baris kode yang sama, tapi hasilnya beda-beda!
s.doPresentation();
}
}
}5. Bedah Kode
- Overloading di
Student: Kita punya dua methodeat. Java membedakan keduanya dari parameternya (kosong vs String). Student[](Array): Inilah kekuatan Polymorphism. Kita bisa membuat satu wadah (Array) bertipeStudent, tapi isinya macam-macam object turunannya (Freshman,Senior).s.doPresentation(): Di dalam loop, kita tidak pedulisitu aslinya object apa. Kita cuma suruh "Presentasi!".- Saat
sadalahFreshman, dia baca slide. - Saat
sadalahSenior, dia demo koding. - Inilah Dynamic Binding.
- Saat
6. Latihan
Seorang arsitek membutuhkan alat hitung otomatis untuk berbagai bentuk bangunan. Setiap bentuk memiliki rumus luas yang berbeda, namun cara memanggilnya harus seragam.
Implementasikan konsep Polymorphism pada class bangun datar berikut:
1. Class Shape (Parent)
- Method
getArea(): Default return0.0. - Method
printArea(): Mencetak nama class dan luasnya dengan format 2 desimal:Luas <NamaClass>: <area>(Gunakanthis.getClass().getSimpleName()untuk mendapatkan nama class).
2. Class Circle (Child extends Shape)
- Attribute:
radius(double). - Constructor: Menerima radius.
- Override
getArea(): Hitung dengan rumusMath.PI * radius * radius.
3. Class Rectangle (Child extends Shape)
- Attribute:
width,height(double). - Constructor: Menerima width dan height.
- Override
getArea(): Hitung dengan rumuswidth * height.
Output yang Diharapkan
Luas Circle: 153.94
Luas Rectangle: 20.007. Kesimpulan
Polymorphism bikin kode kita fleksibel dan scalable.
- Overloading: Bikin method lebih kaya fitur.
- Overriding + Upcasting: Kita bisa memperlakukan banyak object berbeda seolah-olah mereka sama, tapi mereka tetap mempertahankan perilaku unik masing-masing.
Selanjutnya, kita akan belajar konsep terakhir: Abstraction. Gimana kalau Parent-nya cuma ngasih aturan main tanpa ngasih contoh implementasi?