Entrambi riutilizzano un di metodo, ma sono fondamentalmente diversi. = stesso nome, , nella stessa classe, risolto a . = una sottoclasse un metodo genitore con la , risolto a .
Entrambi riutilizzano un di metodo, ma sono fondamentalmente diversi. = stesso nome, , nella stessa classe, risolto a . = una sottoclasse un metodo genitore con la , risolto a .
| Sovraccarico | Override | |
|---|---|---|
| Firma | Deve differire (parametri) | Deve essere identica |
| Relazione | Stessa classe | Genitore ↔ sottoclasse |
| Risolto | Tempo di compilazione (statico) | Runtime (dinamico) |
| Scopo | Praticità / varianti | Polimorfismo |
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) { /* ... */ }
}
Il compilatore sceglie quale print utilizzare in base ai tipi di argomenti — nessuna eredità coinvolta.
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)
Un errore frequente è sovraccaricare accidentalmente quando intendevi fare override (ad es. un errore di battitura nella firma). Usa sempre @Override (Java) o override (C#) affinché il compilatore lo riconosca.
L'override è il motore del polimorfismo — il meccanismo runtime che rende "una interfaccia, molte implementazioni" funzionare.
Conoscere la differenza previene un bug classico: pensare di aver sostituito un comportamento quando in realtà hai creato un secondo metodo mai chiamato.