(BEARBEITEN: theycallmemortys Antwort gibt den praktischen Rat zur Vermeidung dieses Problems in Ihrem Fall. Diese Antwort gibt die Gründe dafür, warum Sie diesem Rat folgen müssen, dh warum die Sprache so gestaltet wurde."
>Sie können nur auf ein geschütztes Member eines anderen Objekts zugreifen, das denselben Typ wie der zugreifende Code (oder eine Unterklasse) hat - obwohl das Member in einem Supertyp deklariert ist.
Aus der Java-Sprachspezifikation, Abschnitt 6.6.2 :
Sei C die Klasse, in der a Geschütztes Mitglied m ist deklariert. Zugriff ist nur innerhalb des Körpers eines erlaubt Unterklasse S von C. Zusätzlich, wenn Id bezeichnet ein Instanzfeld oder eine Instanz Methode, dann:
- Wenn der Zugriff über einen qualifizierten Namen Q.Id erfolgt, wobei Q ein ExpressionName ist, dann ist der Zugriff erlaubt, wenn und nur wenn der Typ des Ausdrucks Q ist S oder eine Unterklasse von S.
- Wenn der Zugriff über einen Feldzugriffsausdruck E.Id erfolgt, wobei E eine Primärdatenbank ist Ausdruck oder durch einen Methodenaufruf Ausdruck E.Id (...), wobei E ein ist Primärer Ausdruck, dann ist der Zugriff nur dann erlaubt, wenn der Typ von E ist S oder eine Unterklasse von S.
Dies ermöglicht es einem Typ, auf Member zuzugreifen, die für seinen eigenen Vererbungsbaum relevant sind, ohne die Kapselung anderer Klassen zu vereiteln. Angenommen, wir haben:
%Vor% und A haben ein geschütztes Mitglied x
deklariert. Wenn die Regel nicht so funktioniert, wie Sie es tun, können Sie die Kapselung umgehen, indem Sie ein Mitglied in Other
:
und nur aufrufen, dass eine Instanz von B
oder C
weitergegeben wird - das Mitglied würde effektiv öffentlich werden, weil Sie es immer umgehen könnten, indem Sie eine andere Klasse einführen ... keine gute Idee. Mit der aktuellen Regel müssten Sie die Unterklasse B
oder C
- die Sie möglicherweise nicht in der Lage sind, ableiten.
Indem Sie dies tun:
%Vor%Sie nutzen eigentlich nicht die Tatsache aus, dass Sie die MidiSynth-Klasse erweitert haben.
Wenn Sie es versuchen sollten
%Vor%Dann werden Sie feststellen, dass Sie Zugriff auf die geschützte Funktion haben.
Tags und Links java inheritance protected