Klicken Sie Zeilen an, die mit + markiert sind. Dort ist Hilfeinformation hinterlegt.
private ObjectInit(/* final ObjectInit this */) { super(); }
Jede Klasse in Java hat mindestens einen Konstruktor. Wenn man keinen explizit schreibt, dann erzeugt der Compiler einen öffentlichen Standardkonstruktor. Bei dieser Klasse ObjectInit ist ein öffentlicher Konstruktor aber sinnlos, weil es in der Klasse keine Instanzvariablen gibt. Mit new erzeugte Objekte der Klasse wären also leer. Guter Programmierstil ist deshalb, bei Klassen ohne Instanzvariablen einen privaten Standardkonstruktor zu schreiben, der nichts tut (der Compiler ergänzt allerdings den Aufruf super(), siehe oben). Der Compiler würde denselben Konstrukor erzeugen, aber eben public. Das private verhindert, dass man außerhalb der Klasse mit new sinnlose leere Objekte erzeugen kann.
Hier wird ein neues Objekt der Klasse Beispiel erzeugt, d.h. es wird Speicherplatz auf dem Heap reserviert, der so groß ist, dass alle Instanzvariablen der Klassen hineinpassen. Die Instanvariablen in diesem neuen Objekt werden dann vom Standardkonstruktor Beispiel() initialisiert. Der Speicherort des neuen Objekts wird dann in der Referenzvariablen x gespeichert.
Die Klasse Beispiel finden Sie ab Zeile 26.
Das gleiche wie in Zeile 18, nur wird zum Initialisieren des neuen Objekts der Konstruktor mit Signatur Beipiel(int) verwendet.
Ausgabe von Objekt x und allen seinen Instanzvariablen. Für die Ausgabe von x mit %s verwendet printf den Aufruf x.toString(). Die Instanzmethode toString() gibt bei jeder Klasse, weil jede Klasse eine Erweiterung von java.lang.Object ist (siehe Folie 4-25).
Wie Zeile 21, nur Objekt y.
Die Klasse Beispiel darf in der Datei ObjectInit.java stehen, weil sie an zweiter Stelle kommt und nicht public ist. Nach dem Übersetzen gibt es trotzdem eine separate Datei Beispiel.class.
Hier werden vier Instanzvariablen definiert, ausnahmsweise public, was eigentlich schlechter Stil ist. Objekte der Klasse belegen also mindesten 16 Byte Speicher, weil ein int 4 Byte Platzbedarf hat. Die Intialisierungen werden in alle Konstruktoren eingefügt.
Der Code aus Initialisierungsblöcken wird ebenfalls in alle Konstruktoren eingefügt. Derartige Initialisierungsblöcke werden in der Programmierpraxis nur selten verwendet.
public Beispiel(/* final Beispiel this */) {
Die auskommentierten Zeilen zeigen, was der Compiler hier automatisch einfügt.
this.d = this.c + 1;
public Beispiel(/* final Beispiel this, */ int i) {
Die auskommentierten Zeilen zeigen, was der Compiler hier automatisch einfügt.
this.a = i; // b wird nicht i + 1 und c nicht i + 2
this.d = this.a + 1;