Die Frage erscheint vermutlich Fortgeschrittenen lächerlich; aber ich habe in dem Punkt zur Zeit einen Knoten im Gehirn.
Das Beispiel, das mich zu Zweifeln in diesen Punkten gebracht hat, sieht wie folgt aus:
Wenn ich das momentan richtig verstehe, ist der beherrschende Faktor, dass eine Instanz von Y erzeugt wird, und deswegen wird immer auf die Methode mX von Y zugegriffen, welche die signatur-gleiche Methoden von Klasse X außer Kraft setzt (overrrides aka überschreibt).
Zudem wird der Zugriff auf die Methode mY nicht dadurch verhindert, dass die Referenzvariable xRef mit dem Typ der Oberklasse X deklariert wurde, die kein Methode namens mY kennt.
- In welchem Maße entscheiden Initialisierungsklasse und Deklarationstyp über den Zugriff auf Methoden?
- Schränkt eine Typangabe bei der Deklaration den Zugriff auf Methoden immer ein?
Das Beispiel, das mich zu Zweifeln in diesen Punkten gebracht hat, sieht wie folgt aus:
Java:
class X {
public void mX() {
System.out.println("Xm1 ");
}
}
class Y extends X {
public void mX() {
System.out.println("Xm2 ");
}
public void mY() {
System.out.println("Ym");
}
}
public class Test {
public static void main(String[] args) {
X xRef = new Y();
Y yRef = (Y) xRef;
yRef.mY();
xRef.mX();
}
}
Wenn ich das momentan richtig verstehe, ist der beherrschende Faktor, dass eine Instanz von Y erzeugt wird, und deswegen wird immer auf die Methode mX von Y zugegriffen, welche die signatur-gleiche Methoden von Klasse X außer Kraft setzt (overrrides aka überschreibt).
Zudem wird der Zugriff auf die Methode mY nicht dadurch verhindert, dass die Referenzvariable xRef mit dem Typ der Oberklasse X deklariert wurde, die kein Methode namens mY kennt.