Ein Konstruktor wird bei der Erzeugung einer neuen Instanz einer Klasse
aufgerufen. Für den Begriff Konstruktor wird auch Instanz-Initialisierungs-Methode
oder Konstruktormethode verwendet. Die Deklaration eines Konstruktors ähnelt der
einer Methode, wobei eine Konstruktordeklaration keine Typangabe für einen
Rückgabewert hat. Der Name eines Konstruktors ist immer festgelegt. Er ist gleich
dem (einfachen) Namen der Klasse, in der der Konstruktor deklariert ist.
Die Beispielklasse Listing 1.15. /* ConstructorExample.java */ public class ConstructorExample { int a; int b; public ConstructorExample(int a, int b) { this.a = a; this.b = b; } public static void main(String[] args) { ConstructorExample ce = new ConstructorExample(3, 4); System.out.println(ce.a + ", " + ce.b); } } Der Aufruf des Konstruktors erfolgt nach dem
public ConstructorExample(int x, int y) { a = x; b = y; } Der Java-Compiler erkennt in diesem Fall, dass Wie bei "normalen" Methoden können auch Konstruktoren überladen werden.
Das Listing 1.16 enthält insgesamt drei Konstruktoren.
Der Name des Konstruktors Listing 1.16. /* ConstructorExample2.java */ public class ConstructorExample2 { int a; int b; int c; String str; public ConstructorExample2(int a, int b) { this.a = a; this.b = b; } public ConstructorExample2(String str) { this.str = str; } public ConstructorExample2(int... varparas) { for (int i : varparas) { this.c = this.c + i; } } public static void main(String[] args) { ConstructorExample2 ce21 = new ConstructorExample2(3, 4); System.out.println(ce21.a + ", " + ce21.b + ", " + ce21.c + ", " + ce21.str); ConstructorExample2 ce22 = new ConstructorExample2("Hello World!"); System.out.println(ce22.a + ", " + ce22.b + ", " + ce22.c + ", " + ce22.str); ConstructorExample2 ce23 = new ConstructorExample2(5, 6, 7); System.out.println(ce23.a + ", " + ce23.b + ", " + ce23.c + ", " + ce23.str); } } Beim Aufruf der Konstruktoren während der Erzeugung eines neuen Objekts, wird der "passende" Konstruktor automatisch ausgewählt. Die Anzahl der beim Aufruf des Konstruktors zu übergebenden Argumente müssen mit den vorhandenen Konstruktor-Parameterlisten "in Einklang" gebracht werden können. Des Beispiel gibt drei Zeilen auf dem Bildschirm aus: 3, 4, 0, null 0, 0, 0, Hello World! 0, 0, 18, null Der letzte Konstruktoraufruf erfolgt mit drei Ganzzahlen. In diesem Fall
wird der Konstruktor mit variabler Parameterliste ausgewählt. Er berechnet die
Summe der drei Zahlen, die anschließend durch die Instanzvariable
Ein Default-Konstruktor wird automatisch generiert,
falls kein Konstruktor innerhalb einer Klassendeklaration angegeben wird. Bei
der Übersetzung mittels > javac HelloWorld.java > javap HelloWorld Compiled from "HelloWorld.java" public class HelloWorld extends java.lang.Object { public HelloWorld(); public static void main(java.lang.String[]); } Ein parameterloser Default-Konstruktor hat die Aufgabe, den Konstruktor
der Superklasse ohne Argumente aufzurufen. Die Ausgabe von > javap -c HelloWorld Compiled from "HelloWorld.java" public class HelloWorld extends java.lang.Object { public HelloWorld(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: ... } Das Beispiel aus Listing 1.15 enthält einen
Konstruktor mit zwei Parametern. In diesem Fall wird bei der Übersetzung des
Java-Quelltextes durch
Die Deklaration von Feldern kann die Initialisierung dieser beinhalten.
Die Zuordnung von Werten für statische Variablen kann auch in einen
statischen Initialisierer "ausgelagert" werden. Er beginnt
mit dem Schlüsselwort static { ... } Als Beispiel können die anschließenden Deklarationen von drei Klassenvariablen dienen, deren Wertezuordnungen in einen statischen Initialisierer übertragen werden sollen. static int i = 3; static float pi = 3.1415f; static String[] str = {"eins", "zwei"}; Eine äquivalente Initialisierung der drei statischen Variablen mit Hilfe eines statischen Initialisierers könnte dann wie folgt aussehen: Listing 1.17. /* StaticInitializerExample.java */ public class StaticInitializerExample { static int i; static float pi; static String[] str; static { i = 3; pi = 3.1415f; str = new String[]{"eins", "zwei"}; } public static void main(String args[]) { System.out.println(StaticInitializerExample.i + ", " + StaticInitializerExample.pi + ", " + StaticInitializerExample.str[0] + ", " + StaticInitializerExample.str[1]); } } Das Beispielprogramm gibt "3, 3.1415, eins, zwei" auf dem
Bildschirm aus. Statische Initialisierer werden im Rahmen des
Initialisierungsprozesses einer Klasse aufgerufen.
Der statische Initialisierer im Java-Quelltext wird in einen statischen
Initialisierer innerhalb der zugehörigen Klassendatei übersetzt. Die erzeugte
Klassendatei Codefragment 1: static int i = 3; static float pi = 3.1415f; static String[] str = {"eins", "zwei"}; Codefragment 2: static int i; static float pi; static String[] str; static { i = 3; pi = 3.1415f; str = new String[]{"eins", "zwei"}; } |
|