Initialisierer / statischer Initialisierer verstehen

NefetsClaxon

Mitglied
Hallo!

Ich habe folgenden kleinen Code geschrieben:

Java:
	public static Klasse abu = new Klasse();
	
	public String ef;
	{
		ef = new String();
		System.out.println("Initialisierer");
	}
	
	public static Integer abu2;
	static {
		System.out.println("Statischer Initialisierer");
		abu2 = new Integer(123);
	}
	
	public Klasse() {
		System.out.println("Konstruktor");
	}
	
	public static void main(String[] args) {
		Klasse  ab = new Klasse();
	}

Ausgabe ist:

Initialisierer
Konstruktor
Statischer Initialisierer
Initialisierer
Konstruktor

Wie ist das zu erklären? Welche Regel steckt dahinter?

Und zweitens: Was spricht dafür/dagegen, Objekte schon bei der Felddeklaration zu initialisieren?

Also z. B. als Feld
Java:
public Integer abc = new Integer()
anzulegen, im Gegensatz zu einer Initialisierung im Konstruktor oder einer Methode?

Danke!
 

--->

Mitglied
Sehr geehrte/r NefetsClaxon,
das von dier gepostete Programm ist nicht komplet.
Wenn du es Vervollständigst :applaus: :toll: wäre es wesentlich einfacher,
deine Frage zu beantworten.
[TIPP]
Immer alles wichtige Posten.
[/TIPP]
[DUKE]euer "--->"[/DUKE]
 
Zuletzt bearbeitet:

Joose

Top Contributor
Wie ist das zu erklären? Welche Regel steckt dahinter?

Kann ich dir leider nicht beantworten, meiner Meinung nach müsste die Ausgabe
Code:
Statischer Initialisierer
zuerst kommen, dann die anderen Ausgaben.

[EDIT]
Ok, habe mich gerade schlau gemacht ;)

Also:
Java:
	public static Klasse abu = new Klasse();
	
	public String ef;
	{
		ef = new String();
		System.out.println("Initialisierer");
	}
	
	public static Integer abu2;
	static {
		System.out.println("Statischer Initialisierer");
		abu2 = new Integer(123);
	}
	
	public Klasse() {
		System.out.println("Konstruktor");
	}

In der main-Methode rufst du den Konstruktor der Klasse "Klasse" auf, dadurch werden die alle statischen Attribute und Initialisierer dieser Klasse aufgerufen (entsprechend der Reihenfolge in der sie in der Klasse stehen.

In diesem Fall steht bei dir als erstes
Code:
public static Klasse abu = new Klasse();
dadurch wird ein einfaches Objekt der Klasse "Klasse" erstellt (daher erst die beiden Ausgaben von Initialisierer und Konstruktor), danach wird der statische Initialisierer ausgeführt. Und zum Schluss das eig Objekt erstellt.

Siehe auch hier

[/EDIT]

Und zweitens: Was spricht dafür/dagegen, Objekte schon bei der Felddeklaration zu initialisieren?

Also z. B. als Feld
Java:
public Integer abc = new Integer()
anzulegen, im Gegensatz zu einer Initialisierung im Konstruktor oder einer Methode?

Das hängt vom Anwendungsfall ab!

Java:
public class Auto {
   /* Um ein Objekt von Farbe zu erstellen brauchst du einen Wert, 
    dieser wird dir hier zum Beispiel erst im Konstruktor zur Verfügung gestellt! 
    */
   private Farbe farbObjekt;

   /* Ein normales Auto hat 4 Räder, daher ist es möglich diesen Wert gleich zu initialiseren,
    wenn man später sein Auto um 1 Achse erweitert könnte man diesen Wert immer noch ändern.
    Ob du diesen Wert nun direkt bei der Deklaration oder im Konstruktor festlegt macht dann aber keinen großen Unterschied */
   private int raeder = 4;

   public Auto(String farbe) {
      this.farbObjekt = new Farbe(wert);
   }
}

public class Farbe {
   /* gleich initialisieren wie hier ist unnötig -> da der wert sowieso über den konstruktor gesetzt wird */
   private String wert = "rot";

    public Farbe(string wert) {
        this.wert = wert;
}

Sprich du als Programmierer musst dir überlegen:
Kann ich diesen Wert schon initialisieren? Bzw. muss ich diesen Wert jetzt schon initialiseren?

Ich persönlich setze alle notwendigen Werte im Konstruktor und nicht bei der Deklaration (dann sind alle Werte die gesetzt werden an einen Fleck!)
 
Zuletzt bearbeitet:

NefetsClaxon

Mitglied
Super, vielen Dank für die Antwort und die Mühe!! Große Klasse!

@die ersten beiden: Stimmt, da fehlt was, aber nur noch Folgendes:
Java:
public class Klasse {

// zeug von oben

}

War also nicht sooo wichtig ;)
 

Joose

Top Contributor
Am besten du probierst noch herum in dem du die Reihenfolge in deinem Code änderst.
Dann wird das Ganze wahrscheinlich "sichtbarer" bei unterschiedlichen Ausgaben :)
 

ceving

Aktives Mitglied
@die ersten beiden: Stimmt, da fehlt was, aber nur noch Folgendes:
Java:
public class Klasse {

// zeug von oben

}

War also nicht sooo wichtig ;)

Ja war wichtig. Hätte ja noch etlicher anderer Kram davor stehen können.

Java:
	public static Klasse abu = new Klasse();

Ausgabe ist:

Initialisierer
Konstruktor
Statischer Initialisierer
Initialisierer
Konstruktor

Wie ist das zu erklären? Welche Regel steckt dahinter?

Naja es ist eigentlich plausibel. Der entscheidende Punkt ist die static-Variable "abu".

Ich denke mal deine Verwunderung rührt daher, dass der Konstruktor und die Instanz-Initialisierung vor dem statischen Initialisierer zu einer Ausgabe führen.

Ich würde sagen es passiert hier folgendes.
  1. Die Klasse wird geladen, weil du dem Java-Interpreter sagst, er soll "main" aus "Klasse" ausführen.
  2. Dazu muss "Klasse" initialisiert werden.
  3. Die erste Aufgabe, die im Rahmen der statischen Initialisierung passieren soll, besteht darin, eine Instanz von "Klasse" zu erzeugen, um sie in der statischen Variable "abu" speichern zu können.
  4. Zum Erzeugen der Instanz von "Klasse" wird die Instanz-Initialisierung von "Klasse" durchgeführt (Ausgabe 1) und danach wird der Konstruktor von "Klasse" aufgerufen (Ausgabe 2).
  5. Danach wird die statische Initialisierung der "Klasse" fortgesetzt und die restlichen Anweisungen aus dem static-Block werden abgearbeitet (Ausgabe 3).
  6. Nachdem die statische Initialisierung abgeschlossen ist, kann "main" aufgerufen werden.
  7. In "main" wird wieder eine Instanz von "Klasse" erzeugt, wofür wieder die Instanz-Initialisierung von "Klasse" durchgeführt (Ausgabe 4) und der Konstruktor aufgerufen wird (Ausgabe 5).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Problem mit statischem Initialisierer Java Basics - Anfänger-Themen 10
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
H Polymorphie Interfaces und statischer Typ Java Basics - Anfänger-Themen 33
C Statischer Typ aber Variable nicht statisch? Java Basics - Anfänger-Themen 5
O Statischer und Dynamischer Typ Java Basics - Anfänger-Themen 6
L Polymorphie Dynamischer oder Statischer Typ für Methodenparameter Java Basics - Anfänger-Themen 8
G Polymorphie, Vererbung, statischer Typ, Laufzeittyp Java Basics - Anfänger-Themen 2
I Statischer Initializer Java Basics - Anfänger-Themen 4
T Unterschied dynamischer und statischer Laufzeittyp Java Basics - Anfänger-Themen 1
kilopack15 this.v mit statischer Variable v? Java Basics - Anfänger-Themen 1
M Input/Output tcp-Server mit statischer Parallelität Java Basics - Anfänger-Themen 7
W If_Bedingung in statischer Methode beim zweiten Mal nicht durchlaufen Java Basics - Anfänger-Themen 14
W Dynamischer und statischer Typ von Referenzvariablen Java Basics - Anfänger-Themen 13
C Methoden Rückgabewert von statischer Methode ignorieren Java Basics - Anfänger-Themen 8
N ArrayList verwenden in statischer Methode Java Basics - Anfänger-Themen 2
R Frage zu statischer Methode toString() Java Basics - Anfänger-Themen 3
Luk10 Problem mit Singleton bzw statischer Referenz! Java Basics - Anfänger-Themen 16
C Seitenwechsel in statischer Methode? Java Basics - Anfänger-Themen 6
P Statischer Import - ich raffs nicht! Java Basics - Anfänger-Themen 3
H Unterschied statischer/dynamische Typ einer Variablen Java Basics - Anfänger-Themen 2
H statischer Zugriff / accessed in a static way Java Basics - Anfänger-Themen 3
Paule Aufruf nicht statischer Methode in statischer MEthode Java Basics - Anfänger-Themen 7
D statischer Konstruktor Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben