Skip to main content

Die 2 Phasen der Klassen-Initialisierung im Java Programm


Klassen-Initialisierung java programmierung

Die Java Klassen Initialisierung durchläuft zwei Phasen.

Diese beiden Phasen sind im Grunde genommen, wie die Phasen 2 und 3 bei der Instanz-Initialisierung.

In Phase eins werden die Klassenvariablen der entsprechenden Java Klassen angelegt

Das heißt diese werden deklariert.

Schau dir den folgenden Code dazu an.
Uns interessiert jetzt erst einmal nur die Klassenvariable x.


public class KlassenInitialisierung {
public static int x=5; //statische Variable vom Datentyp Integer
int y; //Instanzvariable vom Datentyp Integer
 
public static void main (String [] args){
 
}
}

Es wird also java intern ein Speicherplatz für die Variable x reserviert.
Die Größe des reservierten Speicherplatzes ist wieder abhängig vom jeweiligen Datentyp.
Und das war es dann auch schon mit Phase eins.

In Phase zwei wird der Variablen dann ein Wert zugewiesen und es werden Methoden gepackt.

Jetzt, in Phase zwei, wird der Klassenvariablen der entsprechende Wert zugewiesen.


public class KlassenInitialisierung {
public static int x=5; //Zuweisung des Wertes 5 in Phase zwei der Java Klassen Initialisierung
int y; //Instanzvariable vom Datentyp Integer
 
public static void main (String [] args){
 
}
}

Das bedeutet:
Erst in Phase zwei bekommt die Variable den Wert 5 zugewiesen.

Außerdem werden jetzt die Instanzmethoden angelegt.
In diesem Beispiel siehst du die Instanzmethode zunehmenWerte(), welche den Wert der Instanzvariable erhöht.


public class KlassenInitialisierung {
public static int x=5; //statische Variable vom Datentyp Integer
int y; //Instanzvariable vom Datentyp Integer
 
public void zunehmenWerte(){ //Instanzmethode erhöht den Wert der Instanzvariablen
y=y+22;
System.out.println(y);
}
public static void main (String [] args){
 
}
}

Diese Methode wird jetzt java-intern als statische Methode gewandelt.
Diese würde dann als Argument ein Objekt der Klasse erwarten und die Instanzvariablen des Objektes erhöhen.
In diesem Fall heißt das Argument bzw. Variable ganz einfach „wert“.
Und diese Variable ist vom Datentyp „KlassenInititialsierung“.


public class KlassenInitialisierung {
public static int x=5; //statische Variable vom Datentyp Integer
int y; //Instanzvariable vom Datentyp Integer
 
public void zunehmenWerte(){ //Instanzmethode
y=y+22; //Erhöhung der Instanzvariablen
System.out.println(y); //Rückgabe von y
}
public static void zunehmenWerte(KlassenInitialisierung wert){ //abgewandelte Klassenmethode
wert.y=wert.y+22; //Erhöhung der Instanzvariablen
System.out.println(wert.y); //Rückgabe von y
}
public static void main (String [] args){
KlassenInitialisierung objektEins = new KlassenInitialisierung(); //Objekt erzeugen
objektEins.zunehmenWerte(); //Aufruf der Instanzmethode
zunehmenWerte(objektEins); //Aufruf der Java Klassen Methode
}
}

Klar ist, dass beide Methoden genau das Gleiche machen.
Rufe doch, so wie ich auch, beide Methoden einmal in der main-Methode auf und klicke auf „Run“.

Die Instanzvariable y wurde genau zweimal um 22 erhöht.
Nicht schlecht, oder?

Und genau das macht Java mit Instanzmethoden.
Intern werden diese bei der Klassen Initialisierung als statische Methoden gewandelt und geführt.

Das ganze spielt für dich erst einmal keine Rolle.
Was aber durchaus wichtig ist, ist der Unterschied zwischen der Instanz-Initialisierung und der Klassen-Initialisierung.

Also, worin liegt jetzt der Unterschied zur Instanz Initialisierung

Oder warum ist es wichtig, diese Phasen zu kennen.

Klar bei der Instanzinitialisierung durchläuft das Programm 4 Phasen.
Aber es gibt noch einen anderen Unterschied.
Und zwar, wie oft diese Phasen durchlaufen werden.

Ich verwende einmal zwei Codeblöcke um dies besser zu verdeutlichen.


public class KlassenInitialisierung {
public static int x=5; //statische Variable vom Datentyp Integer
int y; //Instanzvariable vom Datentyp Integer
 
{ //nicht statischer Initialisierungsblock
System.out.println("Instanzinitialisierung abgeschlossen");
}
 
static { //statische Initialsierungsblock
System.out.println("Klasseninitialisierung abgeschlossen");
}
 
public static void main (String [] args){
KlassenInitialisierung objektEins = new KlassenInitialisierung(); //Objekt erzeugen
KlassenInitialisierung objektZwei = new KlassenInitialisierung(); //neues Objekt erzeugen
}
}

Der erste Codeblock ist statisch. Dieser erzeugt die Bildschirmausgabe „Die Klasseninitialisierung ist abgeschlossen“.
Der zweite Codeblock ist nicht statisch. Dieser dient der Objekt- oder Instanzinitialisierung.

Wenn du jetzt innerhalb der main Methode zwei Objekte anlegst und dann auf „Run“ klickst…
Ja dann werden beide Initialisierungsblöcke durchlaufen.

Wichtig dabei ist, dass die Klasseninitialisierung nur einmal durchlaufen wird.
Und zwar genau dann, wenn die Klasse das aller erste Mal angesprochen wird.

Die Instanzinitialisierung wird aber bei jedem neuen Objekt durchlaufen.
Außerdem findet die Klasseninitialisierung vor der Objektinitialisierung statt.

Zusammenfassung:

  • Java Klassen werden initialisiert. Das bedeutet, sie werden intern angelegt.
  • Die ganze Java Klassen Initialisierung durchläuft zwei Phasen.
  • In Phase 1 werden die Klassenvariablen angelegt und in Phase zwei werden ihnen die entsprechenden Werte zugewiesen.

Ähnliche Beiträge

So kannst du Instanzen in Java Klassen zählen

java programmierung instanzen in java klassen zählen

Wie kannst du die Instanzen der Java Klassen zählen? Ganz einfach. Am besten ist es, wir bleiben beim Einführungsbeispiel zu den Java Klassen. Und ich wähle die Klasse „Monster“. Um es einfach zu halten, soll auch der Programmstart durch die Klasse erfolgen. Die Klasse bietet somit eine main-Methode an.

So kannst du Java Superklassen mit dem Vererbungsbaum entwerfen

java programmierung superklassen vererbungsbaum

Vererbungsbaum in Java – klingt erstmal komisch. Dennoch wird dies so bezeichnet. Gemeint sind damit – die einzelnen Hierarchiestufen oder Vererbungsebenen – von der Superklasse bis runter zu den Kindklassen. Wie sieht das nun konkret aus? Vererbung bedeutet: Du definierst einen allgemeinen Typen – zB. Möbel Und dann implementierst du […]

10 ganz nützlichen Feature der Klasse Java Math

java programmierung klasse math

In diesem Beitrag geht es um eine spezielle Java Klasse. Die Klasse nennt sich Java Math. Diese ist in der Standardbibliothek von Java enthalten. Warum solltest du diese Klasse kennen? Die Math Klasse bietet dir einen Menge Methoden an, welche zur Berechnung von mathematischen Gleichungen ganz hilfreich sind. Aber auch […]

So unterstützen dich Java Vererbungstabellen beim Klassen-Entwurf

java programmierung vererbungstabellen klassenentwurf

Bei der Java Vererbung gibt es zwei Klassenarten bzw. -stufen. Die Superklassen, welche einen allgemeinen Typen darstellen Und die spezielleren Unterklassen, welche die Superklasse um bestimmte Funktionen erweitern. Jetzt ist dieses ganze „Der-erbt-von-dem-Konzept“ mitunter sehr schwierig darzustellen. Zum Beispiel in einem Werkzeugkoffer. In einem Werkzeugkoffer befinden sich sämtliche Werkzeuge, von […]

Unterschied zwischen Klassenvariable und Instanzvariable im Java Programm

unterschied klassenvariable instanzvariable java programmierung

Bei der Java Programmierung unterscheidet man drei Arten von Variablen. Als erste Gruppe sind die lokalen Variablen zu nennen. Auf diese gehe ich in einem separaten Artikel ein. Mich interessieren die zwei anderen Variablentypen. Zum einen existieren Klassenvariablen. Und dann sind da noch die Instanzvariablen. Wo liegt der Unterschied zwischen […]

So nutzt du Methoden aus der Java String Klasse

java programmierung methoden java string klasse

In einen der letzten Beiträge haben wir darüber gesprochen, dass Java Strings – Objekte sind. Dass Strings in allen Programmen äußerst häufig vorkommen Und dass sich deshalb Referenzvariablen String-Objekte im String Pool teilen. Das Konzept hinter dem String-Pool ist die Teilung der Ressourcen. Und das bedeutet: Weniger Objekte – mehr […]