Wie kann auf 'geschützte statische' Variable der Oberklasse in der Unterklasse zugegriffen werden, wobei die Unterklasse in einem anderen Paket liegt ..?

9

Hier ist die leicht ausgearbeitete Version derselben Frage.

Wir können nicht auf die geschützte Variable (der Oberklasse) in der Unterklasse zugreifen, wo sich die Unterklasse in einem anderen Paket befindet. Wir können nur auf die geerbte Variable der Oberklasse zugreifen. Aber wenn wir den Modifikator in "protected static" ändern, können wir auch auf die Variable der Superklasse zugreifen. Warum ist es so??

Hier ist das Code-Snippet, das ich zu erklären versuchte.

%Vor%

Das obige Verhalten wird erwartet. Aber meine Frage ist, wenn wir den Zugriffsmodifikator der Superklasseninstanzvariable 'a' auf 'protected static' ändern, dann können wir auch auf die Variable (die der Oberklasse) zugreifen ..! Was ich meinte ist,

%Vor%

Der obige Code zeigt die Ausgabe:

Wert in der Superklasse 7

Der Wert von x in der Klasse test1 ist 10

Wie ist das möglich ...?

    
Prasad 24.06.2013, 03:21
quelle

2 Antworten

3

Von "Überprüfen des Zugriffs auf geschützte Mitglieder in der Java Virtual Machine":

  

Sei m ein Member, der in einer Klasse c deklariert ist, die zu einem Paket p gehört. Wenn m öffentlich ist, kann auf jede Klasse zugegriffen werden. Wenn m privat ist, kann nur von c darauf zugegriffen werden. Wenn m über Standardzugriff verfügt, kann nur auf jede Klasse zugegriffen werden, die zu p gehört.

     

Wenn m geschützt ist, sind die Dinge etwas komplizierter. Zuerst kann auf m zugegriffen werden   von jeder Klasse, die zu p gehört, als ob sie Standardzugriff hätte. Darüber hinaus kann auf jede Unterklasse s von c zugegriffen werden, die zu einem anderen Paket als p gehört, mit der folgenden Einschränkung: if < em> m ist nicht statisch, dann muss die Klasse o des Objekts, auf das zugegriffen wird, s oder eine Unterklasse von s , geschrieben o s (wenn m statisch ist, gilt die Einschränkung nicht: m kann sein Zugriff immer von s ).

Ich habe diese Referenz in der JLS-Sektion gefunden 6.6.2.1 , die den Teil über "das Objekt, auf dessen Mitglied zugegriffen wird, s oder eine Unterklasse ... sein muss" unterstützt. Ich sehe nichts, was die statische Klausel unterstützt, aber basierend auf Ihrem eigenen Beispiel ist es offensichtlich wahr.

    
Ryan Stewart 24.06.2013, 04:00
quelle
0

Überschreiben gilt nur für Methoden, nicht für Klassenvariablen. Es gibt keine Möglichkeit, eine Variable zu überschreiben. Sie überschatten das Symbol, das auf die Variable a der Superklasse zugreift.

    
sibidiba 20.10.2015 09:07
quelle

Tags und Links