En metod i en subklass kan "skymma" en metod i samma namn i superklassen. En variation av fordonssexemplet:
class Motorfordon {
private double toppfart;
double getToppfart() {
return toppfart;
}
class Bil extends Motorfordon {
int motorstyrka;
int antal_hjul;
//Antar att toppfarten är motorstyrkan * 1.5
double getToppfart() {
return motorsyrka*1.5;
}
}
Klassen Bil ärver en metod getToppfart() från Motorfordon, men
definierar också sin egen. Om vi skapar en bil och anropar dess metod
getToppfart() gäller att det är metoden i klassen Bil som anropas.
Bil b = new Bil(); b.getToppfart();
I allmänhet gäller att när en metod i en subklass har samma signatur (namn, antal argument och typer på argumenten) som en metod i superklassen är det subklassens metod som kommer att användas. Vi säger att metoden i subklassen överskuggar (engelska: overrides) metoden i superklassen.
Notera dock att i de flesta fall bör överskuggning undvikas. Användning av overriding ger då och då upphov till svårlokaliserade buggar.
En bättre lösning är vanligtvis att definiera en abstrakt klass. Se nästa avsnitt.