<code>class PrivateOverride { private void f() { System.out.println("private f()"); } public void hello(){ this.f(); this.bar(); } protected void bar(){ System.out.print("pri bar"); } } class Derived extends PrivateOverride { public void f() { System.out.println("public f()"); } public void bar(){ System.out.print("deri bar"); } } class Test4{ public static void main(String[] args) { Derived po = new Derived(); po.hello(); } }</code>
Ausgabe:
private f()
deri bar
Warum?
<code>class PrivateOverride { private void f() { System.out.println("private f()"); } public void hello(){ this.f(); this.bar(); } protected void bar(){ System.out.print("pri bar"); } } class Derived extends PrivateOverride { public void f() { System.out.println("public f()"); } public void bar(){ System.out.print("deri bar"); } } class Test4{ public static void main(String[] args) { Derived po = new Derived(); po.hello(); } }</code>
Ausgabe:
private f()
deri bar
Warum?
Erstens ist dies kein direkter Aufruf der private
-Methode von f()
, genauso wie die getter
-Methode die private
-Instanzvariable abrufen kann. Dies bedarf keiner Erklärung.
Hier liegt ein Vererbungsproblem vor: Derived
in der f方法
-Klasse ist keine Umschreibung ihrer übergeordneten Klasse PrivateOverride f方法
, da die überschriebene Methode erfordert, dass der Zugriffsberechtigungsmodifikator der überschriebenen Methode nicht vorhanden sein kann größer als Die übergeordnete Klasse ist strenger. Wenn Sie hello
in der this.f()
-Methode ausführen, findet der Compiler zuerst das f
, das am nächsten kommt (dh das f
der übergeordneten Klasse). also wird private f()
eingegeben.
Natürlich sollten wir in der tatsächlichen Entwicklung versuchen, diese Art von Verwirrung zu vermeiden, und es ist in Ordnung, grundlegende Interviewfragen zu stellen.
Sie greifen über öffentliche Methoden auf private Methoden zu, das ist in Ordnung
public void hello() ist eine öffentliche Methode
Es ist eine private Methode, die den Aufruf dieser Klasse ermöglicht
Gemäß Ihrem obigen Beispiel bedeutet dies nicht, dass die Unterklasse auf die private Methode der übergeordneten Klasse zugreifen kann. Weil hello
selbst eine Methode der übergeordneten Klasse ist.
Wenn die Unterklasse so aussieht:
<code>class Derived extends PrivateOverride { public void hello() { System.out.println("public f()"); } public void bar(){ this.f(); //... } }</code>
Wenn es normal ausgeführt werden kann, bedeutet dies, dass die Unterklasse auf die private Methode der übergeordneten Klasse zugreifen kann.