Ablauf der Objekterstellung

Kranik

Grünschnabel
Hallo zusammen,
ich hab eine Frage warum bei ableitenden Klassen die Initialisierungsreihenfolge anders ist als bei "normalen" Klassen (ja ich weiss diese haben ja auch wiederum Object als Superklasse.. aber sie leiten halt nicht von selbst erzeugten Klassen ab).
Wenn ich eine neue Instanz einer Klasse erstelle die wie folgt aussieht:

public class SuperClass {
String string = new String("global");
/**
* Constructor
*/
public SuperClasse() {
init();
}
public void init() {
System.out.println(string);
string = "ich bin da!";
System.out.println(string);
}
}
wird folgendes ausgegeben:
1)global
2)lokal
3) nach dem erstellen des Objekts hat die variable -string- den wert "lokal"

erstelle ich jetzt eine Ableitung der Klasse wie folgt und erzeuge eine Instanz davon:

public class Ableitung extends SuperClass {
String string2 = new String("global");

/**
* Constructor
*/
public Ableitung() {
super();
}

/**
* {@inheritDoc}
*/
@Override
public void init() {
System.out.println(string2);
string2 = "lokal";
System.out.println(string2);
}
}
lautet die Reihenfolge:
1)null
2)lokal
3) nach dem erstellen hat die Variable -string2- den wert "global"
Ich hätte jetzt erwartet, dass die JVM erst die Variablen erzeugt und die Zuweisungen macht und dann den Constructor aufruft! Warum ist dem nicht so?

Ich hoffe mir kann da wer weiterhelfen! danke schonmal im Vorraus! :D
 
Hi Kranik und herzlich Willkommen bei Tutorials,
also zu deiner Frage. Der Konstruktor wird deshalb zuerst aufgerufen, da über diesen die Superklasse geladen wird. Sprich wenn die Superklasse Parameter zum Aufrufen braucht, müssen diese schließlich über den Konstruktor via super(Parameter1, Parameter2) übergeben werden.
Ich habe mir angewöhnt die Variablen über dem Konstruktor zu definieren sprich:
Java:
private int variable;
und im Konstruktor initialisiere ich sie dann:
Java:
public DeinKlassenName() {
   // super(); <-- steht in jedem Konstruktor (nicht immer sichtbar) zum Aufruf der Superklasse
   this.variable = 4;
}

ps.: Benutze bitte das nächste mal bei Posts von Code die Code-Tags (java), Danke :)

Gruß

Fabio
 
Zuletzt bearbeitet:
Hallo Fabio,

Danke für das Herzliche willkommen! und natürlich auch für die super schnelle Antwort.
Macht ja auch irgendwie Sinn, dass erst der Typ der SuperKlasse erstellt wird.

ok werd ich dran denken die Code-Tags zu werwenden :D

gruß Kranik

p.s. kann geschlossen werden, hmm oder geht das bei euch über den Button "Erledigt" :D hmm testen
 
Zuletzt bearbeitet:
ps.: Um das Thema zu schließen, musst du einfach oben neben den Aufruf- und Antwortenzähler, auf: Erledigt "NEIN" klicken. Dann wird das zu einem "JA" und das Thema wird als erledigt markiert.
 

Neue Beiträge

Zurück