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.