Initialisierung von Klassenvariablen

Sir.JavaNoob

Mitglied
Hallo,

wann genau wird eine Klassenvariable "initialisiert"? Doch immer dann, wenn die Klasse geladen ist oder nicht? Ich habe ein wenig rumgebastelt und bin zu zwei meiner Meinung nach "identischen" Ergebnissen gekommen. Jedoch scheint bei Variante B die Klassenvariable mit dem default Wert 0 initialisiert zu werden. Kommen wir nun zu den Varianten, sonst wird es schwierig nachzuvollziehen, was ich überhaupt meine:

Variante A:

Code:
public class test {
	public static void main(String[] args) {
		M m = new M();
		System.out.println(m.sum);
	}
}

class M {
	int a = 2;
	static int b = 3;
	int sum = 0;
	
	
	public M() {
		sum = a + b;
	}
}

Die Ausgabe liefert 5, was korrekt ist.

Variante B:

Code:
public class test {
	public static void main(String[] args) {
		System.out.println(M.m.sum);
	}
}

class M {
	static M m = new M();
	int a = 2;
	static int b = 3;
	int sum = 0;
	
	
	public M() {
		sum = a + b;
	}
}

Die Ausgabe liefert 2, was darauf schließen lässt, dass die Klassenvariable "b" mit 0 initialisiert worden ist. Doch warum? Wenn eine Klasse geladen ist, so werden meine Instanz- und Klassenvariablen mit dem Vorinitialisiert was ich gesetzt habe. Demzufolge sollte mir Variante B das gleiche liefern, wie Variante A...

Wieso tritt dieser Effekt auf? Stehe ich etwa so massiv auf dem Schlauch? 🙁
 
Ändert sich was, wenn du bei Fall b die Reihenfolge von
Code:
static M m = new M();
und
Code:
static int b = 3;
umkehrst? Zu dem Zeitpunkt, zu dem du deine Variable m initialisierst, ist nämlich die statische Variable b noch nicht initialisiert, sprich 0.
 
Aha. Das ist interessant. Ich deklariere und initialisiere die Klassenvariable "b" bevor ich eine Instanz der Klasse M erzeuge? Sodass b dann den gewünschten Iniialwert enthält. Alles klar, doch warum erhält die Instanzvariable "a" den von mir gewünschten Initialwert, erst dann wenn ich eine Instanz von M erzeugt habe?
Das ergibt für mich keinen Sinn. Die Instanzvariable dürfte ebenfalls nur mit einem default Wert a la 0 vorinitialisiert werden, da diese nach Erzeugung des Objektes initialisiert wird. So eben auch "b". Wieso greift das so? Welche Logik steckt dahinter? Variante A ist für mich äquivalent zu Variante B... 🙁
 
Der Compiler sollte somit beide Varianten gleich behandeln. Ich sehe nämlich keinen Unterschied! 🙁

Nö wie denn? Der muss ja eins nach dem anderen abhandeln.
Wie oben schon gesagt, schiebe die static variable vor die Instanzierung der Klasse und es kommt keine 0 mehr raus.

Der Comipler liest halt erst mal die Felder und setzt deren Werte. Bei Static kommt die Wertzuweisung aus irgend einem Grund erst nach der Instanzierung der Klasse. Hat also eine geringere Priorität.
Eine Variable in Java die nicht instanziert wird, also einfach "int bla;" als Feld, ist immer 0

Compiler zerlegen alles erst mal den in Einzelteile und verarbeiten diese dann nach einem festen Muster.
Dein b verändert die Reihenfolge. In der anderen Klasse wird ja in der main() instanziert und nicht in der Klasse selbst, was man auch so machen sollte. Eine Klasse sollte sich nicht selbst im Feld instanzieren 😉
 
Zuletzt bearbeitet:
Wunderbar dcc, nun ist es mir klar geworden. Ich werde, um weitere Umreinheiten vorzubeugen des öfteren mir die vorgeschlagenen Erklärungen von Oracle durchlesen. Sollte mir einiges dennoch nicht sofort einleuchten, werde ich wiederrum hier im Forum posten. Ich hoffe das wird mir keiner übel nehmen! 😛
In dem Sinn gebe ich das Thema als "erledigt" zu erkennen, dcc erhält gewiss ein Dankeschön. 🙂
 
Ja, die Java Doku ist 1A. Die beste die man findet.
Man muss sie nur mal grob verstanden haben und kann da mehr Wissen rausziehen als aus Büchern.
 

Zurück
Oben