Keduanya menggunakan kembali metode, tetapi fundamentalnya berbeda. = nama yang sama, , dalam kelas yang sama, diselesaikan pada . = subkelas metode induk dengan , diselesaikan pada .
Keduanya menggunakan kembali metode, tetapi fundamentalnya berbeda. = nama yang sama, , dalam kelas yang sama, diselesaikan pada . = subkelas metode induk dengan , diselesaikan pada .
| Overloading | Overriding | |
|---|---|---|
| Tanda tangan | Harus berbeda (params) | Harus identik |
| Hubungan | Kelas yang sama | Induk ↔ subkelas |
| Diselesaikan | Waktu kompilasi (statis) | Waktu runtime (dinamis) |
| Tujuan | Kenyamanan / varian | Polimorfisme |
class Printer {
void print(String s) { System.out.println(s); }
void print(int n) { System.out.println(n); } // same name, diff param
void print(String s, int times) { /* ... */ }
}
Kompilator memilih print mana berdasarkan tipe argumen — tidak ada pewarisan yang terlibat.
class Animal { String speak() { return "..."; } }
class Dog extends Animal {
@Override
String speak() { return "Woof"; } // replaces Animal.speak()
}
Animal a = new Dog();
a.speak(); // "Woof" — runtime picks Dog's version (dynamic dispatch)
Kesalahan umum adalah secara tidak sengaja melakukan overload ketika Anda ingin melakukan override (misalnya kesalahan ketik dalam tanda tangan). Selalu gunakan @Override (Java) atau override (C#) agar kompilator menangkapnya.
Overriding adalah mesin dari polimorfisme — mekanisme runtime yang membuat "satu antarmuka, banyak implementasi" bekerja.
Mengetahui perbedaannya mencegah bug klasik: berpikir bahwa Anda mengganti perilaku padahal sebenarnya Anda membuat metode kedua yang tidak pernah dipanggil.