Kedua-duanya menggunakan semula kaedah, tetapi ia pada asasnya berbeza. = nama yang sama, , dalam kelas yang sama, diselesaikan pada . = subkelas kaedah induk dengan , diselesaikan pada .
Kedua-duanya menggunakan semula kaedah, tetapi ia pada asasnya berbeza. = nama yang sama, , dalam kelas yang sama, diselesaikan pada . = subkelas kaedah induk dengan , diselesaikan pada .
| Overloading | Overriding | |
|---|---|---|
| Tanda Tangan | Mesti berbeza (parameter) | Mesti sama |
| Hubungan | Kelas yang sama | Induk ↔ subkelas |
| Diselesaikan | Masa kompilasi (statik) | Masa larian (dinamik) |
| Tujuan | Kemudahan / 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 yang digunakan berdasarkan jenis argumen — tiada warisan 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 yang kerap terjadi ialah secara tidak sengaja overloading apabila anda bermaksud untuk override (cth. salah taip dalam tanda tangan). Sentiasa gunakan @Override (Java) atau override (C#) supaya kompilator menangkapnya.
Overriding ialah enjin polimorfisme — mekanisme masa larian yang menjadikan "satu antara muka, banyak pelaksanaan" berfungsi.
Mengetahui perbezaannya mencegah pepijat klasik: berfikir anda menggantikan kelakuan apabila anda sebenarnya membuat kaedah kedua yang tidak pernah dipanggil.