Klassen Vererbung und Zugriff auf innere private Variable

Status
Nicht offen für weitere Antworten.

berliner

Mitglied
Hallo,

vielleicht kann mir jemand bei diesem (hier stark vereinfachten) Problem helfen:

Es existiert eine Klasse A, welche eine private Variable _X hat. Ich kann diese Klasse vom Code her nicht verändern, sie muss also als fest angenommen werden. Ausserdem sind innerhalb von A Funktionen, die auf _X zugreifen.

Ich muss jetzt die Funktionalität von A via extend in B erweitern. In B muss ich den Wert von _X ändern können.

Wie bekomme ich Zugriff auf die private Variable von A aus B?

Wenn ich die Sichtbarkeit von _X änder auf public funktioniert via super._X alles problemlos. Aber das ist leider keine Option.

[highlight=Java]
public abstract class A
{

// [...]

private String _X = new String();

// [...]

}
[/highlight]

[highlight=Java]
public class B extends A {

//[...]

protected B()
{
super._X = "blubb";
}

//[...]

}
[/highlight]

Vielen Dank für jede Hilfe im Voraus und Grüße
Der Berliner
 

hdi

Top Contributor
Wenn Klasse A keine Methode zur Verfügung stellt, die B aufrufen kann, ist dies nicht möglich.
A muss also einen Setter anbieten, oder zumindest eine entsprechende Methode, die
protected oder default ist, je nachdem wo dein B liegt.

EDIT 3 : HILFE!:
Weder private Member-Methoden, noch -Variablen werden vererbt.
So laut Definition. Aber ich hab grad n totales Blackout... Ein BMW hat doch auch einen ps-Wert,
selbst wenn das in der Klasse Auto private gestellt wurde ?! Der Zugriff ist was anderes,
aber ich meine die Member-Variable wird doch geerbt?
Hilfe... überall steht: private members are NOT inherited.
Wtf... das heisst ja dass ich beim Aufruf eines getPs() auf einem BMW einen Runtime-Error kriegen müsste. Weil es die Variable nicht gibt...
Weil das nicht der Fall ist, müsste ja dann quasi jeder BMW intern ein eigenes Auto-Objekt
mitschleppen?!
Oh man, Brett vor'm Kopf?
 
Zuletzt bearbeitet:

diggaa1984

Top Contributor
public getter und setter wären ne maßnahme, bzw protected, je nach notwendigkeit.

da die variable private ist, kommst auch in der geerbten klasse nicht ran. Protected würde gehen
 

berliner

Mitglied
@hdi: Schön nicht ganz alleine verwirrt zu sein ;-) Ist das Auto euer Standardbeispiel?

@diggaa1984: "public getter und setter" würde aber nur als Veränderung von A gehen?! In B haben die leider keinen Zugriff. Leider kann ich A nicht verändern, da ich da auf die Umgebung zugreife die übertragbar bleiben muss.
 

hdi

Top Contributor
Wenn du A nicht erweitern kannst, und es keine solchen Methoden liefert, kannst
du mit diesen private Membern in B nix machen. Also das weiss ich definitiv ;)

...das suckt grad so, ich hasse sowas. Ich komm mir vor wie am ersten Tag Java.
Wie kann das sein, dass die nicht vererbt werden.... Wiiiildcard, Electroooonix, Aaaandre,.. ^^
 

diggaa1984

Top Contributor
vielleicht sollte man dann langsam nachfragen warum du genau was ändern willst :D

der Ersteller von A hatte dann entweder nicht alles bedacht, oder eben gerade doch :bahnhof:
 

hdi

Top Contributor
So, ich hab's:
Hier scheint es ganz einfach nur eine schwammige Terminologie zu geben.
"Erben" im streng objektorientierten Sinn heisst, dass das gererbte in der erbenden
Klasse sichtbar ist.
Was es nicht ist, daher die Ausrufe "private Member werden nicht vererbt".

Man kann aber Vererbung auch so definieren:
Alles, was zum einem erbenden Objekt gehört, und von der Superklasse stammt,
wurde geerbt.

D.h. also private Member werden eben DOCH "vererbt". Es gibt sie in der Unterklasse,
aber sie sind nicht sichtbar.

So, aber: private Methoden werden wirklich nie, also wirklich gar nie, vererbt.
(Egal nach welcher Definition).
Eine private Methode existiert in der Unterklasse nicht, man kann sowas also zB auch nicht
überschreiben.

So... jetz kann ich schlafen gehen ;)

@Threadersteller:
Sry für die Verwirrung. Es ist so, wie ich grad sagte. Haste keine Methode in A definiert,
die in B sichtbar ist, hast du null Chancen, dieses private Member zu lesen oder schreiben.
 

hdi

Top Contributor
wie wärs mit .. BMW baut nur die Karosserie drum
hahaha, mach dich halt drüber lustig ;) Das hat mich grad echt voll geschockt.
Und das alles nur weil die Definition von Vererbung nicht klar ist.

Das is genauso ein Kack wie mit "lokalen" Variablen. Was is eine lokale Variable,
was is eine automatic variable, und es gibt noch 3 andere Ausdrücke, die jeder
anders interpretiert...

edit:
Weil auch noch protected erwähnt wurde: Ist okay soweit, aber man sollte wissen
dass eine Klasse, die ein protected Member erbt, dessen access modifier intern auf
private umschreibt.
In einer Subklasse der Subklasse wäre diese Variable also nicht sichtbar, auch
wenn sie in der Oberklasse protected deklariert wurde.

edit2: Ich hoffe ihr nehmt mir solche "Zusatz"-Infos über die nächsten Monate nicht so übel.
Es schadet ja nicht, aber der Zweck ist für mich quasi das einmal hinzuschreiben, für mich selber.
Weil ich grad für so ne Zertifiakt-Prüfung diesen fetten Study Guide büffel, und dort
lauter so Mist lesen muss, den ich mir auch noch merken muss :p
Diese Sache mit protected wusste ich zB bis vor 2 Tagen gar nicht.
Und hier krieg ich die Chance von euch korrigiert zu werden, damit ich mir das nich
total falsch einpräg
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Es ist so, wie ich grad sagte. Haste keine Methode in A definiert,
die in B sichtbar ist, hast du null Chancen, dieses private Member zu lesen oder schreiben.

Und wir wissen ja: Pauschale Aussagen sind IMMER falsch ;) Mit Reflection kommt man da afaik ran. Ist aber nicht Sinn des ganzen... :rolleyes:
 

berliner

Mitglied
Darf ich ganz dreist nachfragen, ob Du mir an meinem oberen Beispiel zeigen kannst, wie das mit Reflection geht? :)
 

hdi

Top Contributor
Würd mich auch interessieren. Wenn das geht, dann ist ja das private Keyword irgendwo unsinnig?
 

Ebenius

Top Contributor
Würd mich auch interessieren. Wenn das geht, dann ist ja das private Keyword irgendwo unsinnig?
Es geht und das private-Schlüsselwort ist nicht unsinnig. Sichtbarkeitseinschränkung hat nichts mit einem Sicherheitskonzept zu tun.

Darf ich ganz dreist nachfragen, ob Du mir an meinem oberen Beispiel zeigen kannst, wie das mit Reflection geht? :)
Bitteschön. [SIZE="+1"]Aber das ist nicht der Weg den Du gehen möchtest![/SIZE]
[HIGHLIGHT="Java"]public class B extends AA {

public String getX() {
try {
final Field field = AA.class.getDeclaredField("_X");
field.setAccessible(true);
return (String) field.get(this);
} catch (SecurityException ex) {
ex.printStackTrace();
} catch (NoSuchFieldException ex) {
ex.printStackTrace();
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
}
return null;
}
}[/HIGHLIGHT]
Ebenius
 

hdi

Top Contributor
Sichtbarkeitseinschränkung hat nichts mit einem Sicherheitskonzept zu tun.
Ach? Also nur mit Kapselung? Krasse Sache, ist ja mal madig dass man mir die Variablen
aller Klassen aus jeder beliebigen Stelle im Programm rausziehen kann..

Was wäre denn dann ein Sicherheitskonzept gegen sowas? Wie kann man sich vor sowas
schützen?

Ich meine wenn ich mich in eine Stelle im Programm reinkriege, sagen wir bei einer
Bank-Software.

Ich bin nun in der Klasse Kunde, sehe dort eine Referenz auf Konto.
Der Setter verlangt eine PIN, per Reflection und den Namen des Setters weiss ich
aber sowohl wie die Klasse heisst als auch wie die Variable heisst (gehen wir davon
aus das ist Java-Beans konform).

Jetzt pack ich mir den Wert per Reflection und addiere da 15 Millionen drauf.

Bravo, Setter, du störst mich nicht. Ich dachte schon, dass es bei Settern und Gettern
auch darum geht,
durch eine Kontrollstelle hindurchgehen zu müssen... Das hat doch definitiv was mit
Sicherheit zu tun?
 

Marco13

Top Contributor
Nicht so ganz. "private" ist keine Firewall, sondern nur ein Hinweis zur richtigen Verwendung. In diesem Sinne ist das hier also falsch
[HIGHLIGHT="Java"]
import java.lang.reflect.*;

class A
{
private int a = 123;

public String toString()
{
return "a="+a;
}
}


class B extends A
{
public void doit() throws Exception
{
Field f = A.class.getDeclaredField("a");
f.setAccessible(true);
int a = f.getInt(this);
System.out.println("In B#doit: a="+a);
f.setInt(this, 456);
}
}


class PrivateAccessTest
{
public static void main(String args[]) throws Exception
{
B b = new B();
b.doit();
System.out.println("After B#doit: "+b);
}
}
[/HIGHLIGHT]
 

hdi

Top Contributor
Ok, also access modifier sind nur eine für den Programmierer aufgezogene Struktur?
Damit ich selber (oder ein anderer Programmierer) zB nicht den Radius eines Kreises
per k.radius = -10 setzen darf,
sondern der Setter das abfängt?
Und aber der Programmierer ja sehr wohl weiss, dass er es NICHT über Reflection machen
sollte, auch wenn er kann,
weil er damit sowohl sich als auch die Kollegen "hintergeht", und sich selber Gefahren
ins Programm schiebt?

Ok also das hab ich wohl verstanden, habe wohl nur die Wirkung von sowas überschätzt.
 

Schandro

Top Contributor
So, aber: private Methoden werden wirklich nie, also wirklich gar nie, vererbt.
(Egal nach welcher Definition).
Eine private Methode existiert in der Unterklasse nicht, man kann sowas also zB auch nicht
überschreiben.
Natürlich existiert während der Laufzeit der Bytecode, der für die private Methode des Objects steht. Ansonsten könnten public Methoden der Oberklasse ja nicht ihre internen private Methoden aufrufen...
Und per Reflection könnte man deswegen auch auf diese private Methoden zugreifen !??
 

hdi

Top Contributor
Schandro, recht herzlichen Dank.. Jetz bin ich wieder verwirrt ;)
Du hast natürlich Recht...Boah.. diese Definitionen.

Wie ist das nun? Kann man private Variablen so behandeln wie private Methoden?
Oder gibt es dann in der Subklasse doch irgendeinen Unterschied?

Ich hab gelesen man kann private Methoden in der Subklasse weder überschreiben
noch überladen, weil es sie dort schlichtweg nicht gibt, also innerhalb des Subklassen-"Scopes",
sagen wir mal so..

Und privat geerbte Variablen.. was ist damit? Kann man die überschatten?

Wenn nein, dann gibt es doch keinen Unterschied zwischen Vererbung von privaten
Variablen und privaten Methoden, oder?
Beide "sind da", aber beide werden nicht "vererbt" im OO-Sinne und können in der Subklasse
nicht geändert, überladen oder überschattet werden.

Ist das richtig?
 

Ebenius

Top Contributor
"Überschatten" ist da das falsche Wort. Von "überschatten" oder "verstecken" oder "verdecken" spricht man, wenn eine Variable namens N in einer Ableitung benutzt wird und in einer darüberliegenden Klasse eine aus der Ableitung sichtbare Variable mit selbem Namen N versteckt wird. Man kann dann nicht mehr so einfach auf die darüber liegende Variable N zugreifen, weshalb von "verstecken" oder "überschatten" die Rede ist.

Wenn ich mich nicht irre, nennt man das genauso, wenn man eine lokale Variable so benennt und eine Variable der Instanz damit versteckt. Und auch wenn man in einer Inner Class Variablennamen benutzt die's draußen gibt. Aber das tut in diesem Kontext nix zur Sache.

Variablen können natürlich verdeckt werden, wenn sie sichtbar sind.

Private Methoden und private Variablen sind in einer Ableitung ohnehin unsichtbar und werden daher auch nicht überdeckt.

Alles existiert immer und wird auch vererbt. Nur sichtbar ist es eben nicht immer.

Ich hoffe, ich konnte zu Deiner Verwirrung beitragen. :cool:

Ebenius
 

hdi

Top Contributor
Ja genau, also beides ist da, nix ist sichtbar, daher kann man Methoden nicht
- überladen
- überschreiben
und Variablen nicht
- überschatten

wenn sie private geerbt wurden (oder korrekt gesagt: eben nicht geerbt wurden ;))
 

Ebenius

Top Contributor
Inhaltlich richtig, aber ich halte diese Formulierung für fehlerhaft. Die Eigenschaften und Methoden sind eventuell nicht sichtbar, werden aber trotzdem vererbt.

Ebenius
 

hdi

Top Contributor
Wie angesprochen: Diese Definition scheint nicht eindeutig zu sein.
Wenn du googlest findest du genug - auch professionelle Quellen - die sagen
dass sowas "never inherited" wird. Die verstehen eben unter Vererbung, dass das
Zeug auch sichtbar ist in der Unterklasse.

Ich persönlich ziehe es aber auch vor, zu sagen etwas wird vererbt, wenn es nun mal
in der Unterklasse exisitiert (wenn auch nicht sichtbar ist)

Für die SCJP Prüfung merke ich mir das aber anders, denn die sehen das eben so,
dass es NICHT vererbt wird.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Vererbung und Zugriff auf Methoden von abgeleiteten Klassen Java Basics - Anfänger-Themen 2
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
F Vererbung von Attributen zwischen zwei Klassen Java Basics - Anfänger-Themen 6
J Vererbung Hilfe zu Klassen / Vererbung Java Basics - Anfänger-Themen 12
K Vererbung equals-Methode bei Vererbung abstrakter Klassen Java Basics - Anfänger-Themen 8
J Klassen, Unterklassen, Vererbung - Compilerfehler Java Basics - Anfänger-Themen 11
Y Klassen, Vererbung, Konstruktoren Java Basics - Anfänger-Themen 13
L Vererbung - Wie Objekte verschiedener Klassen unterscheiden Java Basics - Anfänger-Themen 3
maddin86 Klassen und Vererbung Java Basics - Anfänger-Themen 15
D Zusammenfassung von Klassen (Vererbung? Abstrakte Klass? ...?) Java Basics - Anfänger-Themen 8
N Klassen Vererbung aus KlassenBibliothek (jar) Java Basics - Anfänger-Themen 3
C Klassen/Vererbung/Exception Java Basics - Anfänger-Themen 2
L Klassen/Methoden/Objekt/Vererbung Java Basics - Anfänger-Themen 6
frau-u Problem mit Klassen und Vererbung - benutzen von Methoden Java Basics - Anfänger-Themen 2
L Klassen, Vererbung und Konstruktoren Java Basics - Anfänger-Themen 10
D Initialisierung von Klassen-Objekte Java Basics - Anfänger-Themen 47
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
C Array von Klassen Java Basics - Anfänger-Themen 2
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
L Best Practice Annotierte Klassen im Classpath herausfinden Java Basics - Anfänger-Themen 1
P Mit dem Scanner Klassen aufrufen Java Basics - Anfänger-Themen 3
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
K Zweite Ausgabe von vererbten Klassen Java Basics - Anfänger-Themen 3
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
Speedrunner klassen aufrufen Java Basics - Anfänger-Themen 41
M Log4J (v2) nachträglich in allen Klassen hinzufügen Java Basics - Anfänger-Themen 9
D importieren eigener Klassen Java Basics - Anfänger-Themen 12
W Wo ist der Wurm in meinem Grundverständnis von Klassen? Java Basics - Anfänger-Themen 22
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
elsaaaaaa Wochentag als String ausgeben mit JDK Klassen Java Basics - Anfänger-Themen 6
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
Z Mehtode bei Start des Programms ausführen (Klassen übergreifend) Java Basics - Anfänger-Themen 12
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
TimoN11 Java Klassen Global einbinden Java Basics - Anfänger-Themen 1
B Inventar als einzelne Klassen anlegen? Java Basics - Anfänger-Themen 12
G Java Klassen und Instanzmethoden Java Basics - Anfänger-Themen 15
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
A Generischen Klassen Java Basics - Anfänger-Themen 8
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
J 2 klassen benutzen Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
J Klassen Problem Java Basics - Anfänger-Themen 8
I Java Klassen "Graphics" und "MouseEvent" kombinieren Java Basics - Anfänger-Themen 7
I Klassen als Datentyp nutzen? Java Basics - Anfänger-Themen 11
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
C Klassen objektorientiert aufteilen Java Basics - Anfänger-Themen 6
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
A Auf Eigenschaften von Objekten anderer Klassen zugreifen Java Basics - Anfänger-Themen 5
F Klassen und Pakete Projektübergreifend (Eclipse) Java Basics - Anfänger-Themen 6
V_Fynn03 Klassen Überweisungen tätigen und einzahlen mit 2 Klassen Java Basics - Anfänger-Themen 1
W Abarbeitungsreihenfolge Anonyme Klassen Java Basics - Anfänger-Themen 2
V_Fynn03 Bruchrechner programmieren (2 Klassen) Java Basics - Anfänger-Themen 9
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
E Klassen implementieren Java Basics - Anfänger-Themen 94
T Interfaces in erbenden Klassen Java Basics - Anfänger-Themen 2
C Methoden/Klassen Übergabewerte Java Basics - Anfänger-Themen 8
C Java Klassen/Methoden/Übergabeparameter Java Basics - Anfänger-Themen 4
L Wie geht man bei mehreren Action Klassen vor? Java Basics - Anfänger-Themen 0
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2
L Wie teilt man ein Programm in vernünftige Klassen ein? Java Basics - Anfänger-Themen 10
T Klassen Denkfehler im Klassen "dynamisch" instanzieren? Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
A Methode, Klassen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben