Molemmat käyttävät metodin nimeä uudelleen, mutta ne ovat perusteellisesti erilaisia. = sama nimi, , samassa luokassa, ratkaistu . = aliluokka pääluokan metodin , ratkaistu .
Molemmat käyttävät metodin nimeä uudelleen, mutta ne ovat perusteellisesti erilaisia. = sama nimi, , samassa luokassa, ratkaistu . = aliluokka pääluokan metodin , ratkaistu .
| Ylikuormitus | Ohitus | |
|---|---|---|
| Allekirjoitus | Täytyy poiketa (parametrit) | Täytyy olla identtinen |
| Suhde | Sama luokka | Pääluokka ↔ aliluokka |
| Ratkaistaan | Käännösaika (static) | Ajonaika (dynamic) |
| Tarkoitus | Mukavuus / muunnelmat | Polymorfismi |
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) { /* ... */ }
}
Kääntäjä valitsee, mikä print argumenttityyppien perusteella — perintöä ei ole mukana.
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)
Yleinen virhe on vahingossa ylikuormittaa kun aioit ohittaa (esim. kirjoitusvirhe allekirjoituksessa). Käytä aina @Override (Java) tai override (C#) jotta kääntäjä saalis sen.
Ohitus on polymorfismin moottori — ajonaikainen mekanismi, joka tekee "yhden rajapinnan, monta toteutusta" toimivaksi.
Eron tunteminen estää klassisen virheen: ajatella, että korvaisit käyttäytymisen, kun todellisuudessa loit toisen metodin, jota ei koskaan kutsuta.