Attribute können bei der Deklaration initialisiert werden. Dies gilt sowohl für
als auch für
class Kreis { double r = 1.0; static int kreiszahl = 100; ... }
Initialisierung wird jedesmal bei Erzeugung eines Objektes ausgeführt.
Initialisierung wird nur einmal durchgeführt, wenn die Klasse geladen wird.
class Rechteck { static float max_sv = 2.0; static float max_h = 10.0 static float max_b = max_sv * max_h; ... }
Die Regeln:
Daher bekommen wir hiermit 2 Compiler-Fehlermeldungen:
class falsche_static_inits { static float f = j; // VORWÄRTS! static int j = 1; public int max; static int k = max + 1; // INSTANZVAR! ... }
Für komplexere Initialisierungen, die nicht als einfacher Ausdruck geschrieben werden können, gibt es die statischen Initialisierungsblöcke:
public class Kreis { static private double pi = 3.14; static private double[] sins = new double[1000]; // Statischer Initialisierungsblock static { double x = 0.0; double delta_x = pi / 2 / (1000-1); int i; for (i=0; i < 1000; i++) { sins[i] = Math.sin(x); x += delta_x; } } }
Es darf mehrere solcher Blöcke geben. Sie werden behandelt wie ein einziger, der durch Hintereinanderhängung entsteht.
public class tisch { bein[] beine; int anz_beine = 4; }
Hier gelten ähnliche Regeln wie bei den Klassenvariablen
(Seite ):
Daher bekommen wir hiermit 2 Compiler-Fehlermeldungen:
class falsche_instanz_inits { float f = j; // VORWÄRTS! int j = 1; int k = k + 1; // REKURSIV! ... }
Für komplexerer Initialisierung, die nicht als einfacher Ausdruck geschrieben werden können, gibt es die Instanz-Initialisierungsblöcke (ab Java1.1):
public class tisch { String platte = "Holz"; String[] beine; int anz_beine = 4; { int i; for (i = 0; i < anz_beine; i++) beine[i] = "Bein " + i; } public tisch(String p_material) { platte = p_material; } }
Es darf mehrere solcher Blöcke geben. Sie werden behandelt wie ein einziger, der durch Hintereinanderhängung entsteht.
Nun kennen wir alle Akteure, die bei der Erzeugung neuer Objekte eine Rolle spielen: