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? :(
 

Harry Kane

Top Contributor
Ä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.
 

Sir.JavaNoob

Mitglied
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... :(
 

dcc

Aktives Mitglied
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:

Sir.JavaNoob

Mitglied
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! :p
In dem Sinn gebe ich das Thema als "erledigt" zu erkennen, dcc erhält gewiss ein Dankeschön. :)
 

dcc

Aktives Mitglied
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
S If Abfrage nur mit bestimmter Initialisierung? Java Basics - Anfänger-Themen 8
B Klassen Ungültige Objektzustände bei der Initialisierung Java Basics - Anfänger-Themen 2
A OOP und Initialisierung Java Basics - Anfänger-Themen 5
J Klassen Deklaration und Initialisierung Java Basics - Anfänger-Themen 15
N Methode mit While-Schleife und If-Bedingung und Array-Initialisierung Java Basics - Anfänger-Themen 4
T Erste Schritte Frage zur Initialisierung eines Mehrdimensionalen Arrays Java Basics - Anfänger-Themen 3
R Erste Schritte Deklaration und Initialisierung von Arrays Java Basics - Anfänger-Themen 21
A Variablen Variable soll ihren Wert nach Initialisierung nicht mehr ändern Java Basics - Anfänger-Themen 2
M Interpreter-Fehler Nullpointerexception trotz Ordentlicher Initialisierung Java Basics - Anfänger-Themen 4
M Deklaration und Initialisierung bei Method Erstellung Java Basics - Anfänger-Themen 12
E Initialisierung von Attributen und Konstruktor Java Basics - Anfänger-Themen 0
F Erste Schritte Frage zur Initialisierung Java Basics - Anfänger-Themen 4
D Problem mit Initialisierung und Reihenfolge Java Basics - Anfänger-Themen 10
J Initialisierung Array-Liste Java Basics - Anfänger-Themen 3
S Object Initialisierung Java Basics - Anfänger-Themen 7
F Variable ohne Initialisierung in For Schleife Java Basics - Anfänger-Themen 5
B Initialisierung von Zeichenpanel Java Basics - Anfänger-Themen 3
D Datentypen Felder: Deklaration und Initialisierung Java Basics - Anfänger-Themen 5
Luk10 Saubere Initialisierung im Konstruktor Java Basics - Anfänger-Themen 4
M Variablen Initialisierung von Arrays Java Basics - Anfänger-Themen 7
K Datentypen Default Initialisierung Java Basics - Anfänger-Themen 8
P Initialisierung einer 5*5 Matrix mit best. Werten Java Basics - Anfänger-Themen 2
V Datentypen Array Initialisierung funktioniert nicht Java Basics - Anfänger-Themen 3
B Fragen zur Initialisierung/Zuweisung der Variable + Packages erstellen Java Basics - Anfänger-Themen 4
S jTree initialisierung Java Basics - Anfänger-Themen 4
G Initialisierung + alte Werte Java Basics - Anfänger-Themen 7
F "Initialisierung der VM fehlgeschlagen. res=-4 jvm is n Java Basics - Anfänger-Themen 5
P Grundsätzliches zur String-Initialisierung Java Basics - Anfänger-Themen 2
M String Initialisierung Java Basics - Anfänger-Themen 5
tobiasbeil Fehler array initialisierung. Nur erklärung bitte. Java Basics - Anfänger-Themen 2
T Unterschied Initialisierung von Klassen Java Basics - Anfänger-Themen 3
H String initialisierung Java Basics - Anfänger-Themen 9
A array nach initialisierung final machen? Java Basics - Anfänger-Themen 17
M Initialisierung Java Basics - Anfänger-Themen 4
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
KogoroMori21 Objektvariablen, Klassenvariablen, Instanzvariablen Java Basics - Anfänger-Themen 1
D Richtige Kommentierung Klassenvariablen Java Basics - Anfänger-Themen 19
Z private Klassenvariablen Java Basics - Anfänger-Themen 8
N Klassenvariablen zurücksetzen Java Basics - Anfänger-Themen 4
G Klassenvariablen & Instanzvariablen Java Basics - Anfänger-Themen 4
J Variablen Unterschied zwischen lokalen-, Instanz-, Klassenvariablen Java Basics - Anfänger-Themen 6
N Vererbung Best Practice: Verfeinerte Klassenvariablen in Unterklasse Java Basics - Anfänger-Themen 5
D Klassenvariablen standardmäßig private oder public? Java Basics - Anfänger-Themen 2
A Klassenvariablen zusammen fassen Java Basics - Anfänger-Themen 5
G Frage zu Fields - Klassenvariablen Java Basics - Anfänger-Themen 9
A Klassenvariablen Referenz auf ein Objekt Java Basics - Anfänger-Themen 18
M Variablen Gültigkeit von Klassenvariablen bei Vererbung? Java Basics - Anfänger-Themen 4
J Klassenvariablen lesen Java Basics - Anfänger-Themen 13
B Datentypen Klassenvariablen Java Basics - Anfänger-Themen 2
G OOP Verständisfrage zu Klassenvariablen Java Basics - Anfänger-Themen 5
C Klassenvariablen und Klassenmethoden Java Basics - Anfänger-Themen 17
J Problem mit inneren Klassen und Klassenvariablen Java Basics - Anfänger-Themen 11
G Sollte man Klassenvariablen als final deklarieren? Java Basics - Anfänger-Themen 3
X Zugriff auf Klassenvariablen NUR mit get/set Methoden? Java Basics - Anfänger-Themen 8
W Klassenvariablen und Werte ausgeben Java Basics - Anfänger-Themen 2
D Globale Klassenvariablen. Java Basics - Anfänger-Themen 12
7 Lokale Variablen, Klassenvariablen, Instanzvariablen Java Basics - Anfänger-Themen 15
H Klassenvariablen,methoden Java Basics - Anfänger-Themen 7
M Zugriff auf Klassenvariablen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben