PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java -Vererbung


Gast
2004-06-08, 22:57:34
Der Code:
import java.util.ArrayList;
class Leiter extends Angestellter {
private ArrayList unter=new ArrayList();

Leiter(String vorName, String nachName, String gebDatum, int gehalt){
super(vorName, nachName, gebDatum, gehalt);
}
void addNew(Angestellter ang){
unter.add(ang);
}
String showWithNext(){
Object temp= null;
String h= "";
String g= null;
for(int i= 0; i< unter.size(); i++){
temp= unter.get(i);
if(temp instanceof Leiter){
g= ((Leiter)temp).showWithNext();
h+= "\n"+g;
}
else
h+="\n"+((Angestellter)temp).showOne();
}
return showOne()+h;
}
}

Hi,
ich hoffe ich kann mich richtig ausdrücken.Es ist kein Problem.Eine Frage zum Verständnis.Das private Element Arraylist lässt sich in der Veerbungshierarchie(Ich habe die Leiter-Klasse weiter extended)darauf zugreifen.Also wenn ich von einer Subklasse ein Object erzeuge,kann ich sie im privaten Arraylist vom Object hinzufügen.Ich frage,warum geht das eigentlich?Ich dachte,private Elemente
sein nich sichtbar!Und get und set Methode habe ich auch nicht geschrieben!
Vielleich kennt einer die Rätsels Lösung.
Der"Hawk"

Gast
2004-06-08, 23:08:57
Oh,sorry,habe die Superklasse vergessen!
class Angestellter {
private String vorName;
private String nachName;
private String gebDatum;
private int gehalt;
private static ArrayList aList= new ArrayList();

Angestellter(String vorName, String nachName, String gebDatum, int gehalt){
this.vorName= vorName;
this.nachName= nachName;
this.gebDatum= gebDatum;
this.gehalt= gehalt;
aList.add(this);
}
String showOne(){
return toString();
}
public String toString(){
return vorName+" "+nachName+" "+gebDatum+" "+gehalt;
}
int getGehalt(){
return gehalt;
}
int getSize(){
return aList.size();
}
Object getData(int i){
return aList.get(i);
}
}

HellHorse
2004-06-09, 00:40:08
Original geschrieben von Gast
Das private Element Arraylist
Ich nehme an, du meinst aList.
Die Grenze des private Sichtbarkeitsmodifikators in Java ist die Klasse und nicht das aktuelle Objekt (this). Will heissen, alles was private ist, ist nur innerhalb der Klasse sichtbar, in der es definiert wurde.
Wenn du innerhalb von Angestellter irgendwo aber einen anderen Angestellten hast, kannst du aList von dem sehen, da du ja innerhalb von Angestellter bist und dessen aList auch innerhalb von Angesteller definiert wurde.
Innere Klassen können übrigens das private Zeugs von äusseren Klassen sehen und umgekehrt.

Wenn du dann in Leiter bist, hast du ja Angestellter verlassen, kannst also aList nicht mehr sehen. Möchtest du es sehen, musst du es in Angesteller als protected definieren.
Dann ist aList in allen Subklassen von Angestellter sichtbar.

Zudem ist private statically bound. Will heissen du könntest der ArrayListe in Leiter auch aList sagen ohne dass sie sich mit der in Angestellter in die Quere kommt.

Ich hoffe das hat mehr geklärt als verwirrt.

P.S., es gäbe [ code ] tags ;)

Der"Hawk"
2004-06-09, 00:53:44
Ja,gut,aber auch die Datenfelder von den einzelnen Klassen,zb
auch das ArrayList unter,welches von weitervererbt wird,da konnte die Direktor Klasse(welches wiederum vom Leiter abgeleitet wird)auf sein eigenes ArrayList unter zugreigen.Was mich verwundert,das private Element vom Leiter wird weitervereerbt und er kann sie auch benutzen.Ich dachte das wäre bei private nicht möglich.Direktor sollte das private Element unter nicht zugreifen können.Ich leitet nämlich sukzessiv ab und jede Klasse hat eine Arraylist unter,aber sie dürfte doch nicht drauf zugreigen dürfen.
Also ich bin verwirrt!

HellHorse
2004-06-09, 09:18:03
Original geschrieben von Der"Hawk"
Was mich verwundert,das private Element vom Leiter wird weitervereerbt und er kann sie auch benutzen.Ich dachte das wäre bei private nicht möglich.Direktor sollte das private Element unter nicht zugreifen können.
Das sollte nicht möglich sein, ausser Direktor ist eine innere Klasse.

Der"Hawk"
2004-06-09, 17:11:00
Nee,ist keine innere Klasse,also,wenn ich unter Eclipse,den Debugger starte und das Objekt,z.B Direktor anschaue,dann hat er das private Element trotzdem.Na ja,wenn du Lust hast,kannst du dir das mal anschaen,ich schicke den Source,dann an deine E-MAil.

ethrandil
2004-06-09, 17:17:06
Achso - das ist etwas anderes.

Eclipse verwendet imho einen eigenen Compiler für diese Zwecke.

Vermutlich hat der debugger dadurch die Möglichkeit auch private Felder irgendwie auszulesen...

Im Programm selber, oder mit dem fertig compilierten Programm dürfte das nicht gehen.

- Eth

Gast
2004-06-09, 18:01:27
Das mag ja sein,aber,wenn ich durch mein Programm durchtrace,sehe ich ja wie er zu der Klasse springt,wo das private Memberfeld ist.Das darf doch nicht sein!!!

Der"Hawk"
2004-06-09, 18:11:41
Ich habe nochmal nachgeprüft.Die unterste Subklasse greift auf das static private Arraylist der Basisklasse und auf das private Feld anderer Subklassen priavte Arraylistt unter.Sehr komisch.Kann es an dem Konstruktor aufruf liegen,da er in der Basisklasse natürlich initialisiert wird und dort auf das private Elemnt zugreifen kann?

HellHorse
2004-06-09, 18:23:59
Original geschrieben von Der"Hawk"
Die unterste Subklasse greift auf das static private Arraylist der Basisklasse und auf das private Feld anderer Subklassen priavte Arraylistt unter.
Wo tut sie das denn?
Doch nicht etwa, wenn sie eine Methode einer Superklasse aufruft, die es sehen kann?

Der"Hawk"
2004-06-09, 18:30:58
Meinst du etwa im Konstruktor der Basisklasse,also Angestellter,die public add Methode von Arraylist?

HellHorse
2004-06-09, 20:39:02
Genau.

Der"Hawk"
2004-06-09, 20:47:31
Ok,das erklärt es für die static private im Angestellter Klasse.Erklärt es auch für das private Datenfeld Arraylist unter in der LeiterKlasse?Da habe ich ja eine addNew() Methode,die darauf zugreift.
Komischerweise hat aber bei mir jedes Objekt bei den Klasse schon eine (unter) bevor es initilisiert ist?Das kann doch nicht sein,da private!?

HellHorse
2004-06-09, 22:01:45
Original geschrieben von Der"Hawk"
Komischerweise hat aber bei mir jedes Objekt bei den Klasse schon eine (unter) bevor es initilisiert ist?
Doch sicher, denn du erstellst sie ja explizit bevor der Konstruktor aufgerufen wird.

Gast
2004-06-09, 22:31:51
Ich glaube,ich habe den Mechanismus gecheckt!Also ich hoffe meine Annhame ist richtig.
1.private bedeutet bei Veerbung,dass die Elemnte nur nicht SICHTBAR sind,aber man könnte darauf zugreifen,wenn man in der Basisklasse enstprechende Getter und Setter Methoden schreibt.Denn diese Methode werden ja an die Subklsse weitergeben!
2.Also,wenn ich gewollte hätte,dass man bei mir in der Leiter Klasse nicht auf die privaten Elemnete zugreift,darf man die Methoden,die darauf zugreifen nicht PUBLIC machen,sondern auch PRIVATE,nur dann kann man als Subklasse nicht mehr ran.

Tja,ich dachte,ich hätte es mit Zugriffsmodifikatoren geschnallt,aber man wird immer eines bessern belehrt.War wohl doch komplizierter als ich dachte!!!
Vielleicht kann ja jemand noch was hinzufügen?

Der"Hawk"
2004-06-09, 22:41:47
Original geschrieben von HellHorse
Doch sicher, denn du erstellst sie ja explizit bevor der Konstruktor aufgerufen wird.

Ja,das Element ist doch private,damit dürfte es nicht weiterveerbt werden oder?

HellHorse
2004-06-10, 07:21:29
Original geschrieben von Gast
1.private bedeutet bei Veerbung,dass die Elemnte nur nicht SICHTBAR sind,aber man könnte darauf zugreifen,wenn man in der Basisklasse enstprechende Getter und Setter Methoden schreibt.Denn diese Methode werden ja an die Subklsse weitergeben!

Deshalb auch der Name Sichtbarkeitsmodifikator. Sie kontrollieren lediglich den Zugriff. Erklärt übrigens auch die Frage im folgeneden Post.
Hat eine Instanz einer Subklasse von Leiter eine Instanzvaribale unter? Ja sicher, wie soll sie sonst showWithNext beantworten.
Können die Methoden in der Subklasse darauf zugreiffen (auf unter)? Nein, private verhindert genau das.
Original geschrieben von Gast
2.Also,wenn ich gewollte hätte,dass man bei mir in der Leiter Klasse nicht auf die privaten Elemnete zugreift,darf man die Methoden,die darauf zugreifen nicht PUBLIC machen,sondern auch PRIVATE,nur dann kann man als Subklasse nicht mehr ran.

Nicht public reicht nicht. Wäre es z.B. protected hätten die Subklassen auch darauf Zugriff.

Der"Hawk"
2004-06-10, 10:51:21
Ja,danke an Hellhorse.Ich hoffe,ich habe mit meinem hin und her nicht alle genervt.Aber danl euer Hilfe ist mir das alles viel klarer geworden!