Der new-Operator
Sie wissen bereits, dass jedes Objekt zu einer Klasse gehört und dass sich ein Objekt mit Hilfe des new-Operators anlegen lässt:
Damit wurde ein Objekt vom Typ Hund erzeugt und dieses Objekt ist nach dem Ausführen der Zeile im Arbeitsspeicher Ihres Computers vorhanden. Stellen Sie sich nun einmal vor, Sie schreiben ein komplexeres Programm, in dem sehr viele Objekte erzeugt werden, von denen viele nur eine sehr begrenzte "Lebensdauer" haben sollen - manche Variablen brauchen Sie vielleicht nur kurz und könnten Sie anschließend eigentlich wieder löschen, um Arbeitsspeicher freizugeben.
In manchen Programmiersprachen gibt es dafür einen delete-Befehl, mit dem Sie ein Objekt aus dem Arbeitsspeicher entfernen lassen können. Doch dieser Ansatz bringt ein großes Problem mit sich, denn Sie müssen entscheiden, ob ein Objekt gelöscht werden darf oder nicht - wenn Sie es löschen und anschließend versuchen, noch einmal darauf zuzugreifen, dann wird Ihr Programm abstürzen, denn es greift nun ins Nichts - und wenn Sie es nicht löschen, obwohl Sie es hätten löschen sollen, dann ist es vermutlich zu spät, denn wenn Sie die Referenz auf ein Objekt nicht mehr besitzen (erinnern Sie sich an die Sichtbarkeit von Variablen - wenn Sie eine Referenz auf ein Objekt in einer Methode erzeugen, dann ist diese Referenz auch nur innerhalb der Methode gültig), dann können Sie es auch nicht mehr ansprechen. Kurzum: Die Verwaltung der Lebensdauer von Objekten ist ziemlich aufwändig und Sie müssen ständig daran denken, dass es Ihre Aufgabe ist, Objekte dann, wenn es angemessen ist, auch wieder zu löschen. Gleichzeitig aber ist sie - aus Programmierersicht - auch ziemlich überflüssig, denn sie hält Sie vom Lösen der eigentlichen Aufgabe ab (wie alle Verwaltungen auf dieser Welt) und aus diesem Grund wurde sie in Java auch einfach abgeschafft:
Statt Sie überwachen zu lassen, welche Objekte wann gelöscht werden können, übernimmt die JVM diese Aufgabe - wenn sie feststellt, dass die letzte Referenz auf ein Objekt verlorengegangen ist, so kann die JVM das Objekt löschen. Sie erzeugen Objekte und die JVM löscht sie, wenn Sie sie nicht mehr brauchen - eine sehr komfortable Lösung, die allerdings mit einem leichten Geschwindigkeitsverlust gegenüber anderen Sprachen erkauft wird, denn ein Teil der Leistung ihres Rechners wird nun für die Kontrolle der Lebensdauer verbraucht. Doch dieser Teil ist wirklich sehr gering, während die Zeit, die Sie weniger mit der Suche nach Fehlern verbringen müssen, beträchtlich ist...
Fazit: Der lange Exkurs über eine delete-Anweisung diente nur dazu, Ihnen klar zu machen, dass Sie diese Anweisung nicht brauchen. Im nächsten Abschnitt werden Sie sehen, dass Sie auch den new-Operator manchmal nicht benötigen.
new ohne new
In der ersten "Vertiefung" tauchte ohne weiteren Kommentar die Zeile
auf und sie bewirkt, dass der Integer-Variablen diesesJahr ein Integer-Wert zugewiesen wird - wo bleibt da der new-Operator? Eigentlich müsste doch zunächst ein Objekt erzeugt werden,
um diesem dann einen Wert zuzuweisen! Tatsächlich geschieht dies auch (und noch einiges mehr, wie Sie später lernen werden), aber erneut wird Ihnen hier von der JVM einige Arbeit abgenommen. Es gibt einige Objekt-Typen, die in der Programmierung so häufig vorkommen und die gleichzeitig so "primitiv" sind, dass die Syntax der Sprache Java für diese Klassen um einige Sonderregeln erweitert wurde - unter anderem um die Regel, dass einer Zahl direkt ein Wert zugewiesen werden darf, ohne dass der "Umweg" über den new-Operator gegangen werden muss. Somit bleibt der Code, den ein Programmierer schreibt, übersichtlicher.
Einige dieser häufig auftretenden Klassen finden Sie in dieser Tabelle:
Klasse | Beschreibung | Beispiel |
Integer | Ganze Zahlen, z.B. -1 oder 1 | Integer zahl = 15; |
Float | Fließkomma-Zahlen, z.B. 1.23456 oder -200.0 | Float zahl = 12.5f; |
Double | Fließkomma-Zahlen mit doppelter Genauigkeit | Double zahl = 12.5555d; |
Boolean | Ein Wahrheitswert: Entweder true oder false | Boolean wahr = false; |
Character | Ein einzelnes Zeichen, z.B. 'a', '+' oder 'ß'. | Character zeichen = 'x'; |
String | Eine Zeichenkette, z.B. "Guten Abend" oder "a" | String zeichenKette = "Hallo"; |
Die Klasse Integer kennen Sie schon - mit ihrer Hilfe können Sie mit ganzen Zahlen arbeiten.
Die Klasse Float ermöglicht Ihnen, auch mit reellen Zahlen umzugehen. Wichtig ist hier, dass der Wert, den Sie einem Objekt dieser Klasse zuweisen möchten, mit einem "f" endet
andernfalls wird die Zahl als Double interpretiert und es erscheint die Fehlermeldung
Die Klasse Double ermöglicht Ihnen ebenfalls, mit reellen Zahlen umzugehen - vielleicht fragen Sie sich, warum es zwei Klassen für einen Datentyp gibt? Der Grund liegt im Speicherbedarf - je mehr Stellen eine Zahl haben kann, desto mehr Speicher muss natürlich auch zur Verfügung gestellt werden. Wenn Java nur den Zahlentyp Double kennen würde, dann wäre der Speicher recht schnell voll - daher können Sie je nach dem, was für Werte Sie verarbeiten wollen (Jahreszahlen sind immer ganzzahlig, für einen Taschenrechner bietet sich hingegen wohl die größtmögliche Genauigkeit an), eine geeignete Klasse wählen.
Character ist eine Klasse, mit deren Hilfe Sie mit einzelnen Zeichen umgehen können und die Klasse String haben Sie bereits kennengelernt, denn Sie haben sie benutzt, um die Ausgabe in der belle()-Methode zu ermöglichen:
Die beiden letzten Beispiele enthielten eine Besonderheit, die Ihnen oft begegnen wird: Manchmal ist es nützlich, eine Stelle im Code zu kommentieren, damit man sie auch am nächsten Tag noch versteht, und damit auch ein anderer Programmierer weiß, was dort passiert. Ein einfacher Kommentar in Java wird durch die Zeichenfolge "//" eingeleitet und so interpretiert, als dass alles, was hinter dieser Zeichenfolge in der gleichen Zeile steht, für den Compiler irrelevant ist. Eclipse markiert Kommentare grün, so dass Sie leicht sehen können, was zu einem Kommentar gehört und was nicht.
Die zweite Möglichkeit, eine Stelle im Code zu kommentieren, ist folgende:
Dieser Kommentar-Typ bietet sich an, wenn die Erklärung mehrere Zeilen lang sein soll - mit "/*" beginnt er, und mit "*/" markieren Sie die Stelle, an der er enden soll. Alles davor und danach wird vom Compiler interpretiert, unabhängig davon, ob es in der gleichen Zeile steht wie der Kommentar. Auch dieser Typ des Kommentars wird von Eclipse grün gekennzeichnet.
Parameter, Teil 1
Schließlich soll noch auf die Methode System.out.println() eingegangen werden, damit das erste Beispiel endlich abgeschlossen ist und wir uns von der Klasse Hund verabschieden können.
Bei der Methode System.out.println() ist es möglich, einen Parameter zu übergeben, der dann innerhalb der Methode weiterverarbeitet wird - hier wird dafür gesorgt, dass der Parameter auf der Konsole ausgegeben wird.
Die Methode System.out.println() ist dabei nicht besonders wählerisch - sie gibt alles auf der Konsole aus, egal von welcher Klasse das übergebene Objekt ist. Ändern Sie die main-Methode in Ihrem Programm einmal wie folgt:
Die Ausgabe des Programms sieht dann aus wie folgt:
Im Wesentlichen sieht die Ausgabe so aus, wie Sie es vermuten würden, lediglich die letzte Zeile (die bei Ihnen etwas anders aussehen kann) wird Sie vielleicht verwundern. Dies liegt daran, dass Sie System.out.println()-Methode nicht weiß, wie ein Objekt vom Typ Hund schön formatiert werden kann - eigentlich recht logisch. Sie werden später noch lernen, wie Sie die Ausgabe eines Objekts ändern können. Im Augenblick genügt es jedoch, zu wissen, dass Sie alle Objekte aus der oben abgebildeten Tabelle einfach auf der Konsole ausgeben lassen können.