Praktikum PBO

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

  1. 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.
  2. 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:

FiturOverloading (Compile-time)Overriding (Runtime)
LokasiSatu Class yang samaParent & Child Class
Nama MethodSamaSama
ParameterHARUS Beda (Jumlah/Tipe)HARUS Sama
Return TypeBoleh bedaHarus sama / kompatibel
KeywordTidak 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

  1. Overloading di Student: Kita punya dua method eat. Java membedakan keduanya dari parameternya (kosong vs String).
  2. Student[] (Array): Inilah kekuatan Polymorphism. Kita bisa membuat satu wadah (Array) bertipe Student, tapi isinya macam-macam object turunannya (Freshman, Senior).
  3. s.doPresentation(): Di dalam loop, kita tidak peduli s itu aslinya object apa. Kita cuma suruh "Presentasi!".
    • Saat s adalah Freshman, dia baca slide.
    • Saat s adalah Senior, dia demo koding.
    • Inilah Dynamic Binding.

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 return 0.0.
  • Method printArea(): Mencetak nama class dan luasnya dengan format 2 desimal: Luas <NamaClass>: <area> (Gunakan this.getClass().getSimpleName() untuk mendapatkan nama class).

2. Class Circle (Child extends Shape)

  • Attribute: radius (double).
  • Constructor: Menerima radius.
  • Override getArea(): Hitung dengan rumus Math.PI * radius * radius.

3. Class Rectangle (Child extends Shape)

  • Attribute: width, height (double).
  • Constructor: Menerima width dan height.
  • Override getArea(): Hitung dengan rumus width * height.

Output yang Diharapkan

Luas Circle: 153.94
Luas Rectangle: 20.00
Main.java

7. 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?

On this page