Eigenschappen van subklassen

Overerven van eigenschappen

De subklassen erven alle eigenschappen van hun superklasse over, zowel instance-eigenschappen als klasseneigenschappen. De toegang tot deze eigenschappen hangt echter af van het toegangsniveau. We herhalen even de tabel met verschillende toegangsniveau’s:

Toegangsniveaueigen klassepakketklassensubklassenalle klassen
private
– (package)
protected
public

Enkel protected en public eigenschappen zijn dus toegankelijk vanuit een subklasse in een ander pakket.

De eigenschappen width, height, x en y van de klasse Rectangle zijn evenwel private eigenschappen. Deze eigenschappen zijn dus niet rechtstreeks toegankelijk voor subklassen.

public class Rectangle {
    private int width;
    private int height;
    private int x;
    private int y;
    ...
}

Toevoegen van eigenschappen

Een subklasse kan eigenschappen toevoegen die niet bestaan in de superklasse. Zo kunnen we aan de klasse Square de eigenschap side toevoegen.

public class Square extends Rectangle {
    private int side;
}

Een object van de klasse Square beschikt bijgevolg over de volgende eigenschappen:

  • width
  • height
  • x
  • y
  • side

Vanwege de redundantie, zullen we deze eigenschap side in het verder verloop van de cursus weglaten. Het volstaat ervoor te zorgen dat de height en de width dezelfde waarde hebben.

Vervangen van eigenschappen

Men kan in de klassendefinitie van de subklasse een variabele declareren met dezelfde naam als een variabele uit de superklasse. In dat geval wordt de variabele van de superklasse verborgen (hidden) door de variabele uit de subklasse. We geven een voorbeeld waarbij we de eigenschap publiek maken:

public class Rectangle {
    public final String DESCRIPTION = "Rectangle";
    ...
}
public class Square extends Rectangle {
    public final String DESCRIPTION = "Square";
}

De vervangen eigenschap verbergt dus de eigenschap van de superklasse. Welke eigenschap uiteindelijk gebruikt wordt, hangt af van het type van de referentievariabele.

Square square = new Square();
Rectangle rect = new Square();
System.out.println(square.DESCRIPTION); // prints 'Square'
System.out.println(rect.DESCRIPTION); // prints 'Rectangle'