it-swarm.com.de

Zugriff auf private Instanzvariablen des übergeordneten Elements aus der untergeordneten Klasse?

Nehmen wir an, wir haben eine Klasse foo, die eine private Instanzvariable bar hat.

Lassen Sie uns jetzt eine andere Klasse haben, baz, die extends foo. Können nicht-statische Methoden in baz auf foos Variable bar zugreifen, wenn in foo keine Zugriffsmethode definiert ist?

Ich arbeite übrigens in Java.

23
lfaraone

Nein, nicht gemäß der Java-Sprachspezifikation, 3. Auflage :

6.6.8 Beispiel: private Felder, Methoden und Konstruktoren

Ein privater Klassenmitglied oder Konstruktor ist Nur innerhalb des Hauptteils der Klasse (§7.6) zugänglich, in der Die Deklaration des Members oder Konstrukteur. Es wird nicht von Unterklassen vererbt.

Unabhängig von dieser Spracheinschränkung können Sie candurch Reflektion auf private Felder zugreifen :

Field privateStringField = 
   MyClass.class.getDeclaredField("privateString");
privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);
24
Wim Coenen

Nein, dafür sollten Sie protected. verwenden.

21
RichieHindle

Für Fragen wie diese gibt es eine Tabelle auf der Website hier: http://Java.Sun.com/docs/books/tutorial/Java/javaOO/accesscontrol.html

Grundsätzlich möchten Sie, dass öffentliche oder geschützte Variablen in foo deklariert werden, da dies die Variablen sind, die Unterklassen von ihren übergeordneten Elementen erben und daher in baz angezeigt werden.

6
Sandro

Um eine private Variable einer Superklasse in einer Unterklasse zu verwenden, ist eine Zugriffsmethode erforderlich. Verwenden Sie andernfalls den geschützten Modifikator anstelle von private.

1

Untergeordnete Klassen können nicht auf private Mitglieder zugreifen (dies ist der gesamte Punkt der privaten Zugriffskontrolle). 

1
alphazero

... wenn in foo keine Zugriffsmethode definiert ist?  

Sie brauchen Accessoren. Achten Sie dabei auf die Vererbung. Soll diese Variable wirklich in Eltern sein? Erinnern Sie sich an IS-A Check.

1
ivmos

Sie können nicht auf private Variablen in abhängigen Klassen zugreifen. Normalerweise möchten Sie dafür den Zugriff auf "protected" oder "package" (Standardeinstellung) verwenden. Wenn Sie jedoch wirklich knifflig sein möchten, können Sie auf Reflection und AccessibleObject zurückgreifen, um darauf zuzugreifen. Ich würde das nicht für Produktionscode empfehlen, es sei denn, Sie befinden sich wirklich in einer Bindung. zum Testen usw. ist es in Ordnung.

1
George Armhold

Die privaten Variablen einer Klasse haben ausnahmslos einen Gültigkeitsbereich innerhalb dieser Klasse. Wenn es zwischen den Unterklassen geteilt werden muss, muss es als "protected" deklariert werden.

0
neeranzan