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 ...?
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.
Tags und Links java