Verständnis java protected Modifizierer
Habe ich eine Klasse namens A in package1 und eine weitere Klasse mit dem Namen C in package2. Class C extends Klasse A.
Einer hat eine Instanz-variable, die erklärt wird wie diese:
protected int protectedInt = 1;
Hier ist der code für die Klasse A
package package1;
public class A {
public int publicInt = 1;
private int privateInt = 1;
int defaultInt = 1;
protected int protectedInt = 1;
}
Und hier ist der code für die Klasse C:
package package2;
import package1.A;
public class C extends A{
public void go(){
//remember the import statement
A a = new A();
System.out.println(a.publicInt);
System.out.println(a.protectedInt);
}
}
Eclipse unterstreicht die Letzte Zeile in C. go() und sagt "A. protectedInt" ist nicht sichtbar. Es scheint, dass diese Konflikte mit der definition von "geschützt" - Schlüsselwort in der oracle-Dokumentation.
Den protected Modifizierer gibt an, dass die Mitglied-Zugriff nur innerhalb des eigenen Pakets (package-private) und zusätzlich durch eine Unterklasse Ihrer Klasse in ein anderes Paket.
Was ist denn hier Los?
InformationsquelleAutor mahela007 | 2013-09-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hast du falsch verstanden, die Bedeutung von
protected
. Sie können den Zugriff auf die protected-Elemente deklariertA
innerhalbC
, aber nur für Instanzen vonC
oder Unterklassen vonC
. Sehen Abschnitt 6.6.2 der JLS für details protected access. Insbesondere:(Hervorhebung von mir.)
So diese code wäre fein:
Nicht ohne
protected
, Nein, wenn Sie es waren, die entweder Standard - (Paket -) Sichtbarkeit oderprivate
würde es nicht sichtbar sein.Hmm... Der betonte Teil in Ihrer Antwort sagt, dass "der Zugriff erlaubt ist, wenn E eine Unterklasse, wenn S".. Aber in meinem Beispiel, C ist Unterklasse von A..und ich kann immer noch nicht auf die protected-variable.
Aber
E
istA
hier, undS
istC
. ObwohlC
ist eine Unterklasse vonA
,A
nicht eine Unterklasse vonC
.Bitte auch im Hinterkopf haben, dass protected Methoden und Variablen sind sichtbar nicht nur auf die untergeordneten Klassen, SONDERN AUCH Klassen im gleichen Paket (genau wie die Standard-Objekte sind). Also die Dokumentation ist falsch zu sagen "wenn und nur wenn". (Versuchen Sie, diese selbst alle).
InformationsquelleAutor Jon Skeet
Seit
C
erbtA
,C
kann direkt dieprotected
variableA
wie untenWie pro Ihren code, erstellen Sie eine Instanz der
A
und Zugriff aufprotected
variable durch diese Instanz, die gegen java rule - Eine geschützte variable nicht außerhalb des Pakets sichtbar,Ich lese dies aus dem JLC doc, Jon skeet gepostet. "Ein geschützter member oder der Konstruktor ein Objekt zugegriffen werden darf, die von außerhalb des Pakets, in dem es erklärt wird, nur durch code, der verantwortlich ist für die Implementierung des Objekts auf." Wie kann der code "implementiert ein Objekt" außerhalb des Paket mit dem gleichen Objekt?
Schauen Sie auf Ihre Beispiel - die Mitglieder sind erklärt in
A
, die in einem anderen Paket, die KlasseC
, was "implementiert", ein Objekt des TypsC
.InformationsquelleAutor sanbhat
Wenn du tust
A a = new A();
unda.protectedInt
Sie versuchen, Zugriff auf protected member von A, die illegal nach java-standardsStattdessen können Sie
this.protectedInt
direkt.InformationsquelleAutor Abhishek Singh
Kein Bedarf zu instanziieren, Schutz-Klasse in Protection2 Klasse. Sie können direkt rufen Sie die geschützte variable ohne Instanziierung der Schutzklasse. Da Protection2-Klasse erweitert, Schutz-Klasse. So ist die variable automatisch geerbt von Subklasse.
Versuchen Sie es mit folgenden code:
InformationsquelleAutor Sugumar
Innerhalb des gleichen Pakets, wo die geschützten member deklariert ist, der Zugriff erlaubt ist:
Außerhalb des Pakets, wo die geschützten member deklariert ist, wird der Zugriff erlaubt, wenn und nur wenn Sie durch code, der verantwortlich ist für die Implementierung des Objekts auf. In diesem Fall C ist verantwortlich für die Implementierung des Objekts, also könnte es den Zugriff auf die geschützte.
InformationsquelleAutor Ethan
Geschützt bedeutet :
a)Diesem Mitglied sein wird, zugänglich für alle Klassen im gleichen Paket durch Eine Objekt-Referenz.
b) Für die anderen Paket, wird dies nur im inneren Unterklassen Einer B sagen und die Referenz verwendet werden kann der B-Instanz oder eine Unterklasse von B.
Nehmen wir ein Beispiel:
Lassen Eine übergeordnete Klasse in einem Paket sagen
com.ex1
Lassen B ,C-Klassen in verschiedenen Paket-w.r.t sagen
com.ex2
. AuchB extends A
undC extends B
.Wir werden sehen, wie wir das verwenden geschützter Bereich von A in B (eine Unterklasse von A)
Einen code:
B-code:
C-code:
Für geschützt Statische :
Gleichen Regeln gelten, mit Ausnahme, dass in b) nun ist es zugänglich in jeder Unterklasse von A, indem Eine Klasse Referenz. Referenz
InformationsquelleAutor Breaking Benjamin