3 Stimmen

Verwirrt mit Java Überschreiben der Zugriffsebene

Mögliches Duplikat:
Warum kann man die Sichtbarkeit einer Methode in einer Java-Unterklasse nicht einschränken?

Warum kann ich eine private Methode in der Oberklasse mit einer public in einer Unterklasse, aber ich kann eine public Methode in der Oberklasse in private Methode in der Unterklasse?

Warum?

Ich danke Ihnen im Voraus.

11voto

Joachim Sauer Punkte 290477

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

1voto

Zarkonnen Punkte 21817

Denn es verstößt nicht gegen den Klassenvertrag, eine Methode verfügbarer zu machen. Wenn Kitten eine Unterklasse von Animal ist und Animal eine öffentliche Methode feed() hat, dann muss Kitten auch eine öffentliche Methode feed() haben, da es möglich sein muss, jede Instanz von Kitten wie eine Instanz von Animal zu behandeln. Eine Neudefinition der Zugriffsebene auf privat würde dies zunichte machen.

1voto

Edwin Buck Punkte 67237

Wenn die öffentliche Methode privat würde, wäre es nicht möglich, die Instanz in die übergeordnete Klasse umzuwandeln (weil eine der Methoden nicht mehr verfügbar wäre).

Wenn die private Methode öffentlich wird, dann wäre es möglich, die Instanz in die übergeordnete Klasse hochzuklappen (denn dann hätten Sie keine Möglichkeit mehr, die private / öffentlich überschriebene Methode zu nutzen).

1voto

Robby Pond Punkte 71994

Die Zugriffsebene kann nicht sein más restriktiver als die überschriebene Methode.

privat-->[Standard]-->geschützt-->öffentlich

1voto

Steve B. Punkte 52372

Durch Überschreiben sagen Sie, dass Ihre Unterklasse mit der gleichen API aufgerufen werden kann, aber möglicherweise anders funktioniert. Wenn Sie etwas öffentlich machen, erhöht sich die Zugriffsebene - Sie entfernen also nicht die garantierte Funktionalität.

Indem man eine öffentliche Methode privat macht (wenn man das tatsächlich tun könnte), würde man die Funktionalität entfernen und damit den "Vertrag" brechen. Es macht auch insofern keinen Sinn, als die Methode immer noch öffentlich aufgerufen werden könnte, nur dass der öffentliche Aufruf auf die öffentliche Methode in der Oberklasse zugreifen würde, was kontraintuitiv wäre.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X