Begge gjenbruker et metodenavn, men de er fundamentalt forskjellige. Overloading = samme navn, ulike parametere, i samme klasse, løst ved kompileringstid. Overriding = en subklasse en parent-metode med , løst ved .
Begge gjenbruker et metodenavn, men de er fundamentalt forskjellige. Overloading = samme navn, ulike parametere, i samme klasse, løst ved kompileringstid. Overriding = en subklasse en parent-metode med , løst ved .
| Overloading | Overriding | |
|---|---|---|
| Signatur | Må være ulik (parametere) | Må være identisk |
| Forhold | Samme klasse | Parent ↔ subklasse |
| Løst | Kompileringstid (statisk) | Kjøretid (dynamisk) |
| Formål | Bekvemmelighet / varianter | Polymorfisme |
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) { /* ... */ }
}
Kompilatoren velger hvilken print basert på argumenttyper — ingen arv involvert.
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)
En hyppig feil er å utilsiktet overloade når du mente å override (f.eks. en stavefeil i signaturen). Bruk alltid @Override (Java) eller override (C#) slik at kompilatoren oppdager det.
Overriding er motoren for polymorfisme — kjøretidsmekanismen som gjør at «ett grensesnitt, mange implementeringer» fungerer.
Å vite forskjellen forhindrer en klassisk feil: å tro at du erstattet oppførsel når du faktisk opprettet en annen, aldri-kalt metode.