Zugriff auf private Instanzvariablen von Eltern von Kind-Klasse?
-
03-07-2019 - |
Frage
Lassen Sie uns sagen, dass wir eine Klasse foo
haben, die eine private Instanzvariable bar
hat.
Lassen Sie uns nun eine weitere Klasse haben, baz
, die extends foo
. Kann nicht-statische Methoden in baz
Variable foo
Zugang bar
, wenn es keine Zugriffsmethode in foo
definiert ist?
Ich arbeite in Java, übrigens.
Lösung
Nein, nicht nach dem Programmiersprache Java Spezifikation, 3. Auflage :
6.6.8 Beispiel: Privat-Felder, Methoden und Konstruktoren
Ein privater Klasse Mitglied oder ein Konstruktor zugänglich nur innerhalb des Körpers der Top-Level-Klasse (§7.6), die einschließt Die Erklärung des Mitglieds oder Konstrukteur. Es wird nicht vererbt Unterklassen.
Aber unabhängig von dieser Sprache Einschränkung, Sie können Zugang private Felder durch Reflexion :
Field privateStringField =
MyClass.class.getDeclaredField("privateString");
privateStringField.setAccessible(true);
String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);
Andere Tipps
Nein, dass Sie sollten protected.
verwenden
Für Fragen wie diese, wo eine Tabelle auf der Website hier: http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html
Im Grunde wollen Sie öffentliche oder geschützte Variable in foo deklariert werden, da diese die Variablen, die Unterklassen von ihren Eltern erben und damit in baz gesehen.
Child-Klassen können nicht private Mitglieder zugreifen (das ist der springende Punkt bei der privaten Zugangskontrolle).
... wenn es keine Zugriffsmethode in foo definiert?
Sie müssen Accessoren. Außerdem Vererbungs kümmern, sollte diese var wirklich in Eltern sein? Denken Sie daran, IS-A-Check ..
Sie können keine privaten Variablen in abgeleiteten Klassen zugreifen. Normalerweise würden Sie wollen „geschützt“ oder „Paket“ (Standard) Level-Zugriff für diesen Einsatz. Allerdings, wenn Sie wirklich schwierig sein möchten, können Sie mithilfe von Reflektion und AccessibleObject , um es zu bekommen. Ich würde tun, dass für die Produktion Code nicht empfehlen, es sei denn, Sie wirklich in einer Bindung sind; für die Prüfung, usw., es ist in Ordnung.
Um eine private Variable eines Superklasse in einer Unterklasse zu verwenden, wird eine Zugriffsmethode erforderlich. verwenden Else den geschützten Modifikator statt privat.
Die privaten Variablen (n) eine Klasse haben immer einen Bereich innerhalb dieser Klasse. Wenn es bei den Unterklassen geteilt werden muss, sollte es erklärt „geschützt“
wird