Warum können Unterklassen auf private Methoden der übergeordneten Klasse zugreifen?

WBOY
Freigeben: 2016-08-20 09:03:59
Original
1552 Leute haben es durchsucht

<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>
Nach dem Login kopieren
Nach dem Login kopieren

Ausgabe:
private f()
deri bar

Warum?

Antwortinhalt:

<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>
Nach dem Login kopieren
Nach dem Login kopieren

Ausgabe:
private f()
deri bar

Warum?

  1. 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.

  2. 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>
Nach dem Login kopieren

Wenn es normal ausgeführt werden kann, bedeutet dies, dass die Unterklasse auf die private Methode der übergeordneten Klasse zugreifen kann.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage