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