Objektorientiertes Programmieren I
In diesem Beitrag zum objektorientiertem Programmieren erklären wir dir in einem ersten Anlauf, wie man Objekte mittels Programmierung eindeutig beschreibt.
Inhaltsübersicht
Wiederholung: Was ist ein Objekt?
Dazu wiederholen wir zunächst noch einmal den Begriff „Objekt“. Ein Objekt könnte ein Tennisspieler sein. Aber auch den Tennisball oder den Schläger kann man als Objekt bezeichnen.
Interessant ist aber, dass es in der Programmierung auch Objekte gibt, die man nicht sofort als solche erkennt. Wenn du zum Beispiel objektorientierte Softwares schreibst, wirst du sehen, dass es oftmals schwierig ist exakt festzustellen, was du als Objekte verpackst. Das ist aber in der Programmierung nicht so wichtig. Denn ein Objekt benötigt nur eine Identität, einen Zustand und ein Verhalten.
Der Tennisspieler hat zum Beispiel seine eigene Identität. Dass er sportlich ist, könnte man als seinen Zustand beschreiben. Und sein derzeitiges Verhalten ist, dass er Tennis spielt.
Im Endeffekt kann man alles, das diese drei Eigenschaften erfüllt, in einem Software-Objekt beschreiben – auch wenn man es in der Realität nicht als ein Objekt beschreiben würde. Hier handelt es sich aber nicht mehr um etwas Reales, sondern etwas Virtuelles. Das einzig reale am Software-Objekt ist der Speicher, den er im Computer besetzt. Prozessor, Bussystem, Videokarte und so weiter existieren nur, um mit diesem Speicher zu arbeiten und seinen Inhalt anzuzeigen.
So kann man die Abbildung eines Objekts folgendermaßen ansehen: Man beschreibt ein Objekt mittels Variablen und Methoden. Variablen stehen dabei als Zustandsinformationen zur Verfügung. Methoden arbeiten als Anleitung für das Verhalten des Objekts. So könnten die Variablen zum Beispiel „farbe“, „position“ und „größe“ sein. Die Methoden dazu heißen „bewegen()“ und „farbeAendern()“. Mit Hilfe der Zustandsinformationen kann man damit das Objekt beeinflussen.
Methoden – essenziell für die Durchführung eines Programms
Nachdem das geschriebene Programm zum Objekt kompiliert wurde, wird dieses während der Laufzeit im Arbeitsspeicher erzeugt. Nachdem es durch den Prozessor verarbeitet wurde, fängt es mithilfe deiner Methoden an seinen gewünschten Zweck zu erfüllen.
Wie dir sicher aufgefallen ist, sind Methoden für Programme sehr wichtig. Denn sie sorgen dafür, dass diese existieren und überhaupt etwas machen. Das gleiche gilt übrigens auch für Objekte, da sie zum größten Teil aus Methoden bestehen. Je vielfältiger und komplexer die Methoden sind, desto echter wirkt das Objekt.
Ohne Methoden gäbe es nicht einmal ein Programm. Denn die erste Methode, die damit auch das Programm startet, ist die „main()“-Methode. Sie allein ist dafür zuständig, was das Programm letztendlich macht. Somit kann sie alle notwendigen Anweisungen durchführen, falls es sich um eine kleine Applikation handelt. In einer größeren Applikation erzeugt die main-Methode Objekte, damit sie deren Methoden verwenden kann.
Wenn wir also ein Objekt beschreiben möchten, müssen wir dafür erst einmal eine Klasse schreiben. Erst wenn der „new“-Operator zusammen mit dem Klassennamen verwendet wird, wird ein Objekt dieser Klasse erzeugt. Anders als die Deklaration und Initialisierung, die sich auf Variablen bezieht, wird die Erzeugung eines Objekts allgemein „Instanziierung“ genannt.
Aber Achtung! Nur weil eine Variable auf ein Objekt verweist, bedeutet das nicht automatisch, dass dieses Objekt auch existiert. Die Variable kann zum Beispiel auch nur auf die Adresse eines noch nicht existierenden Objekts verweisen.
Was heißt das jetzt? Stell dir vor du deklarierst eine Variable, die ein Objekt bezeichnet.
Dieses Objekt existiert aber noch nicht. Es ist lediglich ein Platzhalter, der noch nicht auf ein Objekt verweist.
Erst durch den new-Operator existiert das Objekt und die Variable kann verwendet werden.
Objektorientiertes Programmieren – Veranschaulichung
Wenn du dich mit Objekten schon vertraut gemacht hast, weißt du bestimmt, dass Klassen die Nutzung der Java Programmierung erheblich erleichtern. Als Entwickler wird es oft schon etwas schwerer. Denn man muss sich am Anfang immer einen Plan machen wie die Klasse, und damit das Objekt, aussehen soll.
Du kannst dir das ganze so vorstellen: Du bist gerade dabei Muffins zu backen. Der Teig ist dein Speicher, die Backform ist deine Klasse und die Muffins sind deine Objekte. Macht Sinn, oder? Das heißt, dass bei der Erzeugung eines Objekts die Klasse so viel Speicher aus dem Hauptspeicher entnimmt wie es braucht, um damit das gewünschte Objekt zu formen.
Jetzt könnte man sagen, dass es eine unnötige Wiederholung wäre mehrere Muffins mit der gleichen Backform zu formen. Aber sind die Muffins wirklich alle gleich? Jeder Muffins, also jedes Objekt, hat sein eigenes Stück Speicher, also seine eigene Identität. Durch verschiedene Zuckerverzierungen kann sich der Muffin von den anderen der gleichen Backform unterscheiden. Übersetzt bedeutet das, dass unterschiedliche Werte der Variablen den Zustand des Objekts verändern und sich somit von den anderen unterscheidet. Dadurch wird letztendlich auch das Verhalten des Objekts beeinflusst.
Wenn eine Klasse als Backform dargestellt wird, existiert sie dann nicht auch? Ja das tut sie. Genauso wie es Muffins gibt, existiert auch die Backform. Aber beide unterscheiden sich voneinander. Denn während die Backform aus Stahl ist und scharfe Kanten besitzt, sind die Muffins eher weich und aus Teig. Eine Backform hat Merkmale, die nicht mit den Muffins geteilt werden können.
Statische Methoden
In Java werden Merkmale der Klassendefinition, also der Inhalt einer bestimmten Klasse, der nicht von deren Objekten geteilt wird, „static“ genannt. Es gibt nur genau eine Definition für eine bestimmte Klasse. Wenn also eine Methode einer Klasse static ist, dann gilt diese Methode beim Aufruf global für alle Objekte, die erstellt werden. Statische Methoden sind über die Klasse selbst aufrufbar. Hier ein Beispiel dazu:
Wie du in der 3. und 5. Zeile sehen kannst, wurde die Variable und die Methode als statisch beschrieben. Dadurch können wir in der main-Methode in der 14. Zeile die Integer „var“ allgemein für jedes Objekt initialisieren. Dazu benutzen wir eine Methode, die als Parameter den Wert benötigt, den var in der Klasse annehmen soll.
Dass alles geklappt hat, testen wir, indem wir ab der 16. Zeile zwei Objekte erstellen und beide die output-Methode ausführen lassen. Die output-Methode besitzt eine einfache system out print line Anweisung, die den Wert von var ausgibt.
Die Ausgabe beider Objekte ist die gleiche, da wir einen statischen Wert an die Klasse übergeben und somit alle erzeugten Objekte den gleichen Wert haben.
Das war nun ganz schön viel Theorie für’s Erste. Im zweiten Beitrag erklären wir dir Weiteres zum objektorientierten Programmieren.