So lassen sich aus Java Klassen Instanzen erstellen
Lass uns jetzt aus den Java Klassen heraus Objekte anlegen.
Im Einführungsbeispiel hast du bereits gelernt, wie du:
- Instanzvariablen bzw. Attribute anlegst
- Wie du aus einer normalen Java Klasse eine Programmstart Klasse machst
In diesem Artikel erfährst du:
- Was Objekte bzw. Instanzen sind.
- Wie sich Objekte zusammensetzen.
- Wo und wie du Instanzen aus Java Klassen anlegen kannst.
- Und was genau bei diesem Vorgang passiert.
Objekte bzw. Instanzen sind eine Zusammenfassung von Daten aus Java Klassen.
Stell es dir als Trichter vor.
Oben kommen die Instanzvariablen rein.
Diese werden dann zusammengefasst und es entsteht ein neuer Datentyp.

Objekte sind somit eine Zusammenfassung von Daten aus einer bestimmten Klasse.
Und den Bauplan für die ganze Zusammenstellung liefern die Java Klassen.
Am Beispiel:
In unserem Java Adventure haben wir bisher diverse Klassen angelegt.
In der Beispielklasse Held habe ich dir bereits gezeigt, wie du Instanzvariablen anlegen kannst.
Wir haben bisher drei Attriubute der Klasse angelegt:
- den Namen
- das Alter
- die Größe

Wenn wir diesen Trichter jetzt einsetzen, um einen Helden zu erschaffen….

Dann werden die Instanzvariablen „heldAlter“, „heldGroesse“ und „heldName“ zusammengefasst.
Und es entsteht ein Objekt vom Datentypen eines Helden.
Dieser neue Datentyp fasst drei primitive Daten (String, int und float) zusammen.
Man spricht deshalb auch von einem komplexen Datentypen.
Und wenn du jetzt Objekte von diesem Datentypen anlegst, nennt man diese:
- Instanzen der Klasse
- Objekte der Klasse
- Oder auch Member der Klasse
Bevor wir gleich Objekte aus der Heldenklasse anlegen, lass uns noch folgende Frage klären:
In welchen Java Klassen kannst du Objekte anlegen?
Instanzen kannst du in allen Klassen anlegen.
Zum Beispiel:
Kannst du Objekte der Klasse „Held“ in der Monsterklasse anlegen.
Du kannst sogar Objekte der Klasse Start in der Klasse „Raumschiffe“ anlegen.
Das Ganze ist also recht flexibel.
Die Frage sollte somit nicht lauten:
Wo kannst du Objekte anlegen.
Sondern – wo macht es Sinn?
Und deshalb ist die Frage – „Wann sollten im Programmablauf Objekte erzeugt werden?“ – die bessere.
Schauen wir uns die bisherigen Klassen einmal an:

Wo könntest du jetzt Helden erschaffen?
Klar bei den Monstern oder bei den Raumschiffen.
Möglich ist es – Aber es ergibt für unsere jetzige Konstellation wenig Sinn.
Die Helden sollen zum Programmstart erschaffen werden.
Und wo findet der Programmstart statt?
In der main-Methode.

Alles was der main-Methode übergeben wird, wird beim Programmstart ausgeführt.
Und das heißt: jede Anweisung, jeder Methodenaufruf.
Also warum übergeben wir der main-Methode nicht ein paar Helden. 🙂
Doch wo genau?
Schau dir dieses Bild dazu an:

- Wenn du die Heldobjekte auf Ebene der Klasse (roten Teil) anlegen würdest, gehören diese zur Klasse Start.
- Die Startklasse hat nichts mit dem Programmstart zu tun.
Es ist lediglich von uns gewollt, dass diese Klasse so heißt und diese Methode anbietet. - Das entscheidende Element für den Programmstart ist die main-Methode.
Und diese Methode könntest du in jeder Klasse implementieren. - Die Objekte müssen also innerhalb des blauen Teils, dem Methodenrumpf, erstellt werden.
Ganz konkret würde dies dann so aussehen:

Jetzt haben wir das Was und das Wo geklärt….
Dann lass es uns endlich auch tun. 🙂
So kannst du Objekte aus Java Klassen erstellen.
Das wäre der Code zum Erstellen von zwei Java Objekten der Klasse „Held“:
public class Start {
public static void main(String[] args) {
Held heldEins = new Held();
Held heldZwei = new Held();
}
}
Schauen wir uns den Code genauer an.
Und zwar von rechts nach links.
Der rechte Teil ist der Konstruktoraufruf.

Auf der rechten Seite der Gleichung siehst du die Anweisung: new Held().
Dies ist ein sogenannter Konstruktoraufruf, welcher ein Held-Objekt anlegt.

Da dieser Konstruktor in meinem Code zweimal aufgerufen wird, entstehen zwei Objekte.
Und da in der Anweisung Held() und nicht Monster() steht, werden Objekte der Heldenklasse erstellt.
Falls du aus allen anderen Java Klassen ebenfalls Instanzen erstellen möchtest, musst du den hinteren Teil des Codes ersetzen.
- new Held() – erschafft einen Helden
- new Monster ()- erschafft ein Objekt aus der Klasse Monster
- new Raumschiff()- erschafft ein Objekt aus der Klasse Raumschiff.
- ….usw
Okay das haben wir geklärt.
Schauen wir uns den ersten Teil der Anweisung an.
Der linke Teil ist die Variable.

Links der Gleichung siehst du die Variable, welche angelegt wird.
Diese Variablen heißen „heldEins“ und „heldZwei“.

- Die Variablen beinhalten ein Verweis auf dieses Objekt im Speicher.
- Du kannst auch sagen: „Die Variablen zeigen auf die Objekte“.
Und weil diese Variablen lediglich verweisen, nennt man diese auch Referenzvariablen. - Den Namen der Variablen kannst du frei wählen.
Weiterhin müssen alle Variablen einem gewissen Datentyp entsprechen.
In diesem Fall ist es der komplexe Datentyp „Held“.
Verbunden werden beide Seiten durch eine Zuweisung.
So jetzt haben wir die rechte und linke Seite des Codes geklärt.
Scheinbar verbunden werden beide Teile durch ein Gleichheitszeichen.
Es ist aber kein Gleichheitszeichen.
Es handelt sich hier auch nicht um eine Gleichung.

Stattdessen spricht man von einer Zuweisung.
Und diesen Operator (=) nennt man Zuweisungsoperator.
Weil es wirklich wichtig ist….
Zusammenfassend nochmal den ganzen Code von links nach rechts:

- Zuerst der Datentyp „Held“.
Dieser ist ein komplexer Datentyp, da dieser die Instanzvariablen der Klasse „Held“ zusammenfasst. - Dann folgen die Referenzvariablen „heldEins“ und „heldZwei“.
Diese verweisen auf zwei Objekte im Speicher. - Dann folgt die Zuweisung in Form eines „Gleichheitszeichens“.
- Und schließlich – Auf der rechten Seite des Codes befindet sich ein sogenannter Konstruktoraufruf.
Durch diesen Konstruktoraufruf werden zwei „Held-Objekte“ im Speicher angelegt.
Ich möchte dir noch ganz kurz zeigen, dass du aus allen Klassen heraus Objekte anlegen kannst.
Unsere bisherigen Klassen aus dem Einführungsbeispiel sind:

Und hier der Code mit Kommentaren.
public class Start {
public static void main(String[] args) {
Held heldEins = new Held();//Helden Objekt 1
Held heldZwei = new Held();//Helden Objekt 2
Monster monsterEins = new Monster();//Monsterobjekt hat noch keine Attribute
Start starterPacket = new Start();//Objekt der Klasse Start
Monster heldNamen = new Monster();//Der Name der Variablen kann frei gewählt werden
Monster monsterZwei = new Held();//Das geht nicht da Monster kein Held ist
}
}
Du siehst:
- Du kannst aus allen Klassen Objekte anlegen.
- Der Name der Referenzvariablen ist völlig egal.
- Einen Helden vom Datentyp Monster kannst du nicht anlegen.
Da ich bisher nur in der Heldenklasse, Instanzvariablen deklariert habe – kann ich zwar aus allen Klassen Objekte erstellen.
Diese haben aber keine Eigenschaften /Attribute.
Es ist somit zu diesem Zeitpunkt sinnlos diese Instanzen anzulegen.
Und somit zurück in die Heldenklasse. 🙂
Diese erstellten Objekte beinhalten dann alle Attribute aus den jeweiligen Java Klassen.
Ich habe einmal die Variablen der Heldenklasse durch die gelben Punkte dargestellt.

Du siehst ja, dass jedes Objekt jetzt eigene gelbe Punkte hat.
Das bedeutet, dass jedes Objekt dieser Java Klasse eigene Eigenschaften bzw. Werte beinhalten kann.
Somit kannst du zwei Objekte erstellen und diesen individuelle Werte für die Instanzvariablen zuweisen.
Und dann hast du ganz individuelle Heldenobjekte, welche sich klar in ihren Eigenschaften unterscheiden.
Wie du den Attributen Werte zuweist, zeige ich dir im nächsten Beitrag.
Zusammenfassung:
- Aus den einzelnen Java Klassen lassen sich Objekte erstellen.
- Diese Instanzen entsprechen dann einem neuen Datentypen.
Der Datentyp ist eine Zusammenfassung der Instanzvariablen aus den entsprechenden Java Klassen. - Um so eine Instanz zu erstellen, muss eine Referenzvariable des neuen Datentypen angelegt werden.
Diese speichert einen Verweis zum Objekt. - Ein neues Objekt kann nur über den Aufruf des Konstruktors der entsprechenden Java Klassen erstellt werden.