Java 7 Grundkurs

Parameterübergabe II: Referenztypen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Im zweiten Teil der Parameterübergabe lernen Sie, wie neben einfachen Datentypen auch Objekte als Parameter übergeben werden können. Viele Methoden lassen sich generieren und Sie erfahren mehr zu Katzen und Objektreferenzen.
12:17

Transkript

Neben einfachen Datentypen können wir auch Objekte als Parameter an Methoden übergeben. Schauen wir uns an, wie sich Änderungen, die die Methode am übergebenen Parameter vornimmt, in solchen Fällen auswirkt. Auch dazu erstellen wir uns wieder ein kleines Testprojekt "File New Project Java Application". Wieder müssen wir einen Namen vergeben, ich nenne es "Parameterübergabe Objekte". Keine Main Class, die bauen wir uns selbst. Auf "Finish" drücken wird das Projekt erzeugt. Objekte werden ja bekanntlich nach Bauplänen erstellt, also nach Klassen. In diesen Klassen steht drin, wie die Objekte zur Laufzeit aussehen sollen. Um also ein Objekt an eine Methode übergeben zu können, müssen wir erstmal beschreiben, wie dieses Objekt aussehen soll und dazu eine eine extra Klasse erstellen. Machen wir das mal, also auf das Projekt, rechte Maustaste, "New Class". Und diese Klasse nennen wir mal "Katze". Eine Katze macht sich für solche Tests bestimmt recht gut. Um etwas zu haben, was wir an dieser Katze ändern können, wir ihr mal einen Namen. Wir legen also ein Attribut an, Attribut ist "private", ist vom Typ String. und wir nennen es "Name". Um es verändern zu können, um also von außen drauf zugreifen zu können, brauchen wir jetzt eine Set-Methode, und um es auslesen zu können, brauchen wir eine Get-Methode. Die können wir uns von NetBeans generieren lassen, indem wir Alt+Einfügen, drücken und dann haben wir hier den Punkt "Getter and Setter". Jetzt können wir hier "Name" anklicken und dann werden uns Get- und Set-Methode automatisch generiert. Wir hätten sie auch nicht anders getippt, wir sparen uns nur eben halt etwas Tipparbeit auf diese Weise. Die Get-Methode heißt jetzt "getName()" und liefert den Namen an den Aufrufer zurück und die Set-Methode übernimmt einen Namen und setzt den Namen dieses Objektes auf den übergebenen Namen. So wie die Klasse momentan aussieht, könnten wir jetzt eine Katze erzeugen, ohne ihr einen Namen zu geben. Wir würden einfach ein Katzenobjekt kreieren und niemals "setName()" aufrufen. Dann würde das Attribut "Name" den Defaultwert bekommen, den Standardwert, und der wäre "null". Aber welche Katze möchte schon "null" heißen? Objekte werden ja bekanntlich durch Aufruf eines Constructors erzeugt, der das Objekt erstellt und initialisiert. Diesem Constructor können wir Parameter übergeben, die dann gleich für die Initialisierung verwendet werden können. Auch den lasse ich mir jetzt mal von NetBeans generieren, Alt+Einfügen, da steht es "Constructor". Ich möchte, dass er den Namen übernimmt und intern das Attribut entsprechend setzt und dann sieht er so aus. Eine Zeile zuviel, hier unten auch. Der Konstruktor heißt genauso wie die Klasse, nämlich "Katze". Er gibt nichts zurück, das ist es, was ihn zum Konstruktor macht. Er übernimmt einen Parameter und setzt das interne Attribut auf diesen Parameter. So, jetzt ist unsere Katzenklasse vollständig, wir können Katzen erzeugen und ihnen gleich einen Namen geben. Wir können den Namen auslesen und wir können den Namen auch verändern. Jetzt bauen wir uns unseren Katzenveränderer. Wir erstellen also eine neue Klasse. "New Class", "Veränderer" und er bekommt wieder eine Methode "ändern". Diese Methode nimmt diesmal eine Katze. Wir nennen sie "Katze". Nun gibt es prinzipiell zwei Dinge, die diese Ändernmethode mit der Variablen "Katze" machen kann. Zum einen können wir von "Katze" Methoden aufrufen, zum zweiten können wir den Variablen einen neuen Wert zuweisen. Wir beginnen mit der zweiten Variante und weisen "Katze" einen neuen Wert zu, nämlich eine Referenz auf eine neue Katze. Nennen wir sie "Berta". Um unseren Veränderer zu testen, benötigen wir jetzt wieder ein ausführbares Programm, eine Klasse mit einer Main-Methode und die erstellen wir uns. Wir könnten die Main-Methode auch direkt in die Veränderer-Klasse hineinpacken, aber Objektorientierung heißt auch, saubere Trennung der Zuständigkeiten. Und der Veränderer ist nun mal hauptsächlich dafür zuständig, Katzen zu verändern und nicht ein Programm zu starten. Deshalb also eine zweite Klasse. Da sie den Veränderer testen soll, nenne ich sie "Veränderer-Test". Hier eine Main-Methode, Kürzel "psvm", public static void main, und die Tabulatortaste, und schon gibt uns NetBeans das, was wir haben wollen. Das hier oben noch mal weg, so. In dieser Main-Methode machen wir jetzt folgendes: Wir erstellen uns einen Veränderer, wir erstellen uns eine Katze, dann geben wir die Katze an den Veränderer und dann schauen wir, wie die Katze heißt. Also, Veränderer bauen, Strg+Leertaste, nochmal Strg+Leertaste, auch den Variablennamen kann man sich also vorschlagen lassen, ist gleich "New", nochmal Strg+Leertaste, "Veränderer". Wir erzeugen uns ein Verändererobjekt und merken uns die Referenz auf das Objekt in dieser Variablen Veränderer, daher ja auch der Name "Referenzvariable". Bei der Katze sieht das ganz genauso aus, auch hier eine Referenzvariable erzeugen, nennen wir sie "Meine Katze", "New", "Katze", müssen wir hier einen Namen angeben, nennen wir die Katze "Bruno", typischer Katzenname. Ok, wir haben den Veränderer, wir haben die Katze, geben wir die Katze in den Veränderer und schauen, was passiert. Wir rufen die Methode "Ändern" auf, hier ganz unten. NetBeans stellt jetzt schon fest "Ändern" möchte etwas haben vom Typ Katze, darüber gibt es eine Variable vom Typ Katze und schlägt eben demzufolge also auch diese Variable gleich mal vor. Wir können die also einfach mit "Enter" übernehmen. So, der Veränderer soll ja die Katze ändern, indem er hier etwas Neues zuweist, mit einem anderen Namen: "Berta". Unsere Katze heißt "Bruno", d.h. wir schauen danach mal, welche Namen denn "Meine Katze" trägt. Für system.out.println das Kürzel sout+TAB-Taste und hier geben wir ein und holen uns hier den Namen der Katze, ich würde sagen Meine Katze.getName. Ok, Programm ist fertig. Veränderer wird gebaut, Katze wird gebaut, Katze wird in den Veränderer gepackt und danach gucken wir, welchen Namen die Katze trägt. Ausführen, ja, Veränderer-Test ist tatsächlich meine Hauptklasse, und siehe da, wir haben eine Katze erzeugt, die "Bruno" heißt, und die Katze heißt am Ende immer noch "Bruno". Was ist passiert? Zu Beginn erzeugen wir ein Katzenobjekt mit dem Namen "Bruno". Das ist das hier. Dieses Katzenobjekt befindet sich irgendwo im Hauptspeicher. Dann haben wir eine Referenzvariable "Meine Katze", diese Variable verweist auf dieses Katzenobjekt. Über diese Variable können wir also das Objekt ansprechen. Im nächsten Schritt rufen wir nun "Ändern" von unserem Veränderer auf. In der Methode "Ändern" ist ein Parameter deklariert vom Typ Katze und der heißt "katze" mit einem Kleinbuchstaben. Es gibt also jetzt eine zweite Referenzvariable, die "katze" heißt. Der Aufruf der Methode "Ändern" mit dem Parameter "Meine Katze" führt nun dazu, dass das, was in "Meine Katze" drinsteht, kopiert wird in "katze", d. h. was hier in der Referenzvariablen drinsteht, wird kopiert in diese Referenzvariable. In "Meine Katze" hier oben steht eine Referenz auf das Objekt "Bruno" drin. Wenn wir das kopieren, steht demzufolge auch in dieser zweiten Variablen eine Referenz auf das Objekt "Bruno". Jetzt befinden wir uns in der Methode "Ändern". Dort wird eine neue Katze erzeugt, also ein zweites Katzenobjekt, mit dem Namen "Berta" und dann wird der Variablen "Katze" die Referenz zugewiesen auf diese Objekt. "Katze" verweist nun also nicht mehr auf "Bruno", sondern auf "Berta". An "Bruno" ändert sich dadurch gar nichts und an "Meine Katze" hier oben erst recht nicht. Die Methode ist zu Ende, wir kommen zurück und wenn wir jetzt meine "Katze" nach ihrem Namen fragen -"Meine Katze" verweist immer noch auf "Bruno"-, bekommen wir demzufolge also den Originalnamen "Bruno". Auch die Übergabe von Referenzvariablen erfolgt also, indem der Wert der Variablen kopiert wird. Wenn ich dann an der Kopie irgendwelche Änderungen vornehme, indem ich ihr einen neuen Wert zuweise, dann hat das wieder keine Auswirkungen auf die Originalvariable. Nun gibt es aber ja noch eine zweite Möglichkeit, was diese Ändern-Methode mit der Katzenvariable machen kann. Sie kann nämlich von dieser Katzenvariable Methoden aufrufen, also sprich über die Katzenvariable am Objekt Methoden aufrufen und dadurch das Objekt ändern. Schauen wir uns auch diesen Fall zuerst im Beispiel an. Ich passe dazu meinen Veränderer etwas an, und zwar nehme ich jetzt diese Variable einfach entgegen, drücke "Punkt", rufe also von dieser Katze eine Methode auf und zwar die Methode "setName()". Jetzt übergebe ich hier den neuen Namen. D.h., dass der Veränderer jetzt kein neues Katzenobjekt mehr erzeugt, sondern er übernimmt halt diese Variable hier und ruft über die Variable vom Objekt eine Methode auf und übergibt da einen Parameter. Am Testprogramm ändere ich nichts, das bleibt unverändert. Schauen wir, was jetzt passiert, wenn ich das Programm ausführe. Die Katze heißt jetzt tatsächlich "Berta". D.h. also, ich habe das Originalobjekt verändert. Auch das schauen wir uns nochmal kurz in der Grafik an. Der Anfang ist derselbe wie eben. Wir haben ein Katzenobjekt erzeugt mit "New Katze" und haben den Namen auf "Bruno" gesetzt. Die Referenzvariable "Meine Katze" verweist auf dieses Katzenobjekt. Beim Aufruf der Methode "Ändern" wird nun hier für die Methode eine neue Variable angelegt, eine Referenzvariable, kein neues Objekt, und die Variable heißt "Katze". Der Parameter wird übergeben, indem der Inhalt von "Meine Katze" kopiert wird in "Katze". D.h. also, die Referenz, die hier oben drin steht, wird kopiert in diese Variable hier unten. Beide verweisen nun also auf dasselbe Objekt. Jetzt kommt die Stelle, an der der Veränderer seine Arbeit macht. Er ruft von "Katze" die Methode "setName()" auf und übergibt einen neuen Namen, d.h. "Katze" verweist ja auf dasselbe Objekt wie "Meine Katze", es wird also am Originalobjekt eine Veränderung vorgenommen. Sie haben also gesehen, wenn Sie Objekte als Parameter an Methoden übergeben, dann machen Sie das, indem Sie die Referenzvariablen übergeben, diese Variablen werden dann kopiert, es ist im engeren Sinne auch hier pass by value, aber das Objekt wird dabei nicht kopiert. Die Methode arbeitet also mit demselben Objekt wie der Aufrufer, und alle Änderungen, diese Methode hier unten am Objekt vornimmt, nimmt sie demzufolge am Originalobjekt vor.

Java 7 Grundkurs

Machen Sie sich mit den Grundlagen der Java-Programmierung vertraut und lernen Sie die Syntax der Sprache sowie das Konzept der objektorientierten Softwareentwicklung kennen.

8 Std. 32 min (66 Videos)
Tolles Tutorial!
Anonym
Nicht nur eine schöne Einführung in Java, sondern auch die Objekt-orientierte Programmierung wird hier anschaulich erklärt.

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!