2009-05-04 2 views

Antwort

22

Nein, nicht nach den java language specification, 3rd edition:

6.6.8 Beispiel: privat Felder, Methoden und Konstruktoren

Ein privates Klasse Mitglied oder ein Konstruktor ist nur innerhalb des Körpers der Top-Level-Klasse (§7.6) zugänglich, die die Erklärung des Mitglieds oder Konstruktor umfasst. Es wird nicht von Unterklassen vererbt.

Aber unabhängig von dieser Sprache Einschränkung, Sie könnenaccess private fields through reflection:

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

String fieldValue = (String) privateStringField.get(privateObject); 
System.out.println("fieldValue = " + fieldValue); 
+0

Verwendung kann auf Instanzvariablen geschützt werden –

19

Nein, sollten Sie protected.

+3

Eigentlich sollten Sie einen geschützten Setter verwenden, falls die private Variable aus einer zukünftigen Version der Klasse entfernt wird. – jmucchiello

1

Child-Klassen verwenden nicht private Mitglieder zugreifen kann (das ist der springende Punkt bei der privaten Zugangskontrolle).

1

... wenn in foo keine Zugriffsmethode definiert ist?

Sie benötigen Accessoren. Außerdem, kümmern Sie sich um Vererbung, Sollte diese Var wirklich in Eltern sein? Denken Sie daran, IS-A-Check ..

1

Sie können keine privaten Variablen in abgeleiteten Klassen zugreifen. Normalerweise würden Sie dafür den "geschützten" oder "Paket" (Standard) Level-Zugriff verwenden. Wenn Sie jedoch wirklich knifflig sein wollen, können Sie mit Reflektion und AccessibleObject darauf zurückgreifen. Ich würde das für Produktionscode nicht empfehlen, es sei denn, Sie sind wirklich in einer Bindung; zum Testen usw. ist es in Ordnung.

1

Um eine private Variable einer Superklasse in einer Subklasse zu verwenden, ist eine Accessor-Methode erforderlich. Verwenden Sie andernfalls den geschützten Modifizierer anstelle von privat.

0

Die private (n) Variable (n) einer Klasse haben immer einen Bereich innerhalb dieser Klasse. Wenn es unter den Unterklassen geteilt werden soll, sollte es als "protected" deklariert werden.

Verwandte Themen