Das Überschreiben einer Methode kann die Sichtbarkeit nicht verringern. Dies zuzulassen, würde gegen die Liskov-Substitutionsprinzip die (vereinfacht) besagt, dass alle Objekte einer abgeleiteten Klasse B
muss die gleichen Eigenschaften haben wie die Basisklasse A
. In diesem Fall würde eine solche "Eigenschaft" eine öffentliche Methode sein foo
die "verloren" gehen würden, wenn B
hatte dieselbe Methode, machte sie aber protected
.
Außerdem, da private
Methoden nicht vererbt werden (versuchen Sie, sie von einer abgeleiteten Klasse aus aufzurufen!), können sie nicht überschrieben werden. Sie können eine public
Methode mit demselben Namen wie eine private
eine in der Basisklasse, aber das ist kein Überschreiben, sondern einfach eine neue Methode mit demselben Namen, aber ohne andere Beziehung. Anrufe an die private
Methode in der Basisklasse wird nicht rufen Sie die public
Methode in der Superklasse, auch wenn sie auf Objekten der Superklasse ausgeführt wird!
Mit anderen Worten: private
Methoden niemals Laufzeit-Polymorphismus verwenden.
Siehe dieses Beispiel:
public static class Base {
public void callBoth() {
foo();
bar();
}
private void foo() {
System.out.println("Base.foo");
}
protected void bar() {
System.out.println("Base.bar");
}
}
public static class Sub extends Base {
public void foo() {
System.out.println("Sub.foo");
}
public void bar() {
System.out.println("Sub.bar");
}
}
Bei der Ausführung von new Sub().callBoth()
wird die Ausgabe so aussehen:
Base.foo
Sub.bar