Frage

Ich habe gerade einen seltsamen Fehler, der einen geschützten Modifikator beinhaltet.

Ich habe den folgenden Code:

package p1;

public class C1 {
    protected void doIt() {}
}


package p2;

public class C2 extends p1.C1 {
    private C1 c1_instance;
    public void doItAgain() {
        c1_instance.doIt(); // wtf!!!!
    }
}

Ich bekomme einen Fehler und behaupte das doIt() Hat geschützten Zugriff und kann nicht zugegriffen werden! Aber ich bin in der Unterklasse und habe und habe Zugang zu doIt() Methode.

Ist es nicht ein Fehler?

War es hilfreich?

Lösung

Ich hatte auch den Eindruck was protected bedeutete "aus demselben Paket oder aus einer Unterklasse zugänglich", aber die Java -Sprachspezifikation ist natürlich präziser und erklärt, dass in einer Unterklasse S von C "Wenn der Zugriff durch einen qualifizierten Namen q.id ist, wobei Q ein Ausdrucksname ist, ist der Zugang nur dann zulässig, wenn der Typ des Ausdrucks q ist s oder eine Unterklasse von S. "

Sie können also nur auf a zugreifen protected Methode der Superklasse über einen Verweis auf die Unterklasse, aus der Sie aufrufen, wie folgt:

public class C2 extends C1 {
    private C2 c2_other_instance;
    public void doItAgain() {
        c2_other_instance.doIt();
    }
}

Wenn Sie erklären, warum Sie aus einer anderen Instanz der Unterklasse auf eine Instanz der Superklasse zugreifen möchten, kann möglicherweise jemand ein besseres Design vorschlagen. Andernfalls müssen Sie die Methode erstellen public Oder legen Sie die Klassen in das gleiche Paket.

Andere Tipps

In Java kann man nicht anrufen protected Methoden auf einer anderen Instanz der Basisklasse, sogar von innerhalb einer Unterklasse:

public class C2 extends p1.C1 {
    private C1 c1_instance;
    public void doItAgain() {
        doIt();             // fine
        c1_instance.doIt(); // disallowed
    }
}

Die einzige Ausnahme ist, wenn sich sowohl die Basisklasse als auch die Unterklasse im selben Paket befinden.

Um das zu zitieren Java oo Tutorial:

Das protected Modifier gibt an, dass das Mitglied nur in seinem eigenen Paket (wie bei Paket-privat) und zusätzlich durch eine Unterklasse seiner Klasse in einem anderen Paket zugegriffen werden kann.

Geschützt ist gleichbedeutend mit dem Zugriff auf Packungsebene. Sie können nicht auf die Methode zugreifen, wenn Sie sich in einem anderen Paket befinden.

Sie sollten doit () direkt aufrufen können, ohne das C1_Instance -Objekt zu durchlaufen, da C2 eine Unterklasse ist.

Aus http://download.oracle.com/javase/tutorial/java/javaoo/accesscontrol.html

"Der geschützte Modifikator gibt an, dass das Mitglied nur in seinem eigenen Paket (wie bei Paket-privat) und zusätzlich durch eine Unterklasse seiner Klasse in einem anderen Paket zugegriffen werden kann."

C2 kann eine Unterklasse von C1 sein, aber dies bedeutet nicht, dass es in einer anderen Instanz auf diese Methoden zugreifen kann, dh c1_instance ist möglicherweise keine Instanz von C2. Sie könnten darauf zugreifen, wenn es im selben Paket wäre.

Nein, protected versichert den Zugang im selben Paket und in den Nachkommenklassen. Sie befinden sich weder im selben Paket noch von einer Nachkommenklasse auf sie zugreifen. C2 ist aber ein Nachkomme, aber c1_instance nicht.

Wenn Ihre Methode als geschützt deklariert wird, können Sie in dieser Klasse mit dem Paket und innerhalb der Unterklasse darauf zugreifen.

Hier ist hier die Frage: Warum gibt es einen Fehler, obwohl er aus seiner Unterklasse auf dieses geschützte Mitglied zugreifen kann. Die Antwort besteht darin, auf die geschützte Methode aus einer Unterklasse zuzugreifen. Ihre Unterklasse sollte die Methode direkt aus der direkten Unterklasse verwenden. Hier ist die direkte Unterklasse C2, aber die Instanz c1_instance nicht. Sie können diese Methode direkt anstelle von c1_instance.doit () anstelle von c1_instance ()) verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top