Båda återanvänder ett metodnamn, men de är fundamentalt olika. = samma namn, , i samma klass, löst vid . = en subklass en föräldrarmetod med , löst vid .
Båda återanvänder ett metodnamn, men de är fundamentalt olika. = samma namn, , i samma klass, löst vid . = en subklass en föräldrarmetod med , löst vid .
| Överbelastning | Åsidosättning | |
|---|---|---|
| Signatur | Måste skilja sig åt (parametrar) | Måste vara identisk |
| Relation | Samma klass | Förälder ↔ subklass |
| Löst | Kompileringstid (statisk) | Körtid (dynamisk) |
| Syfte | Bekvämlighet / varianter | Polymorfism |
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) { /* ... */ }
}
Kompilatorn väljer vilken print baserat på argumenttyper — ingen arv inblandat.
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)
Ett vanligt misstag är oavsiktlig överbelastning när du menade att åsidosätta (t.ex. ett stavfel i signaturen). Använd alltid @Override (Java) eller override (C#) så att kompilatorn fångar det.
Åsidosättning är motorn bakom polymorfism — körnningsmekanimsmen som gör "ett gränssnitt, många implementeringar" möjlig.
Att känna till skillnaden förhindrar ett klassiskt fel: att tro att du ersatte beteende när du faktiskt skapade en andra metod som aldrig anropas.