Einleitung
Die OO-Programmierung ist eine Philosophie des Programmierens, die von einer Welt ausgeht, die aus gleichberechtigten und einheitlich erscheinenden Objekten besteht (Methoden der Informatik). Wie bei vielen Prinzipien, die in der Praxis den Erfordernissen angepasst werden, gibt es auch beim objektorientierten Programmieren eine Reine Lehre. Diese baut nicht auf Prozeduren und Daten auf, sondern auf Zuständen, Aktivitäten und Kommunikation:
(1) Es gibt nur Objekte, die sich nach außen alle einheitlich verhalten und alle gleichberechtigt sind.
(2) Objekte besitzen Zustände, führen Operationen (Methoden genannt) aus und können Nachrichten (messages) empfangen und verschicken.
(3) Um die Fähigkeiten von Objekten zu nutzen, schicken sich Objekte gegenseitig Nachrichten, durch die sie um die Erledigung einer bestimmten Aufgabe mit Hilfe einer Methode nachsuchen; das benachrichtigte Objekt antwortet dann mit einem Objekt, welches als Ergebnis an das fragende Objekt zurück gesendet wird.
Dies ist für viele Programmierer eine völlige Umstellung, die gelernt haben, sich zuerst das Innenleben aller Programmteile genau anzusehen. Zugleich erfordert dies sehr viel Vertrauen: Da man Objekten nicht mehr die eigenen Algorithmen aufzwingen kann, muss man sich darauf verlassen, dass Objekte tatsächlich richtig arbeiten. Diese Denkweise ist der menschlichen Denkwelt viel näher als die heutige gängige Form der Datenverarbeitung.
Derjenige jedoch, der Objekte konstruieren und definieren muss, benötigt ein klares Schema von der inneren Struktur von Objekten. Die Struktur wird durch sog. Klassen festgelegt ).
Zur Erläuterung der Abbildung Definitions-Schema: Ein Objekt ist ein in sich abgeschlossenes Gebilde (roter Rahmen). Sein Aufbau wird beschrieben, indem man Vererbungen, gemeinsame Methoden und die individuellen Besonderheiten dieses Objekts angibt. Von außen sieht man nur die Vererbungen und die Methoden, die das Objekt ausführen kann.
Bei der Vererbung gibt man die Eltern an, also die Namen anderer Objekte, deren gesamte Eigenschaften das neue Objekt dann ebenfalls besitzt. Diese Beschreibung von Objekten nennt man ein Schema. Die Menge aller Objekte, die einem Schema genügen und die somit die gleichen Methoden besitzen, bezeichnet man als Klasse. Man kann nun beliebig viele konkrete Objekte aus einem Schema erzeugen (Instanzen einer Klasse), die genau nach diesem Schema aufgebaut sind, aber nach ihrer Erzeugung ein Eigenleben führen und sich bzgl. ihrer Zustände (Werte) und damit auch ihrer Reaktionen voneinander unterscheiden können.
Objekte besitzen individuelle Instanz-Variablen (zum Anbinden anderer Objekte, meist einfach nur zum Ablegen von Werten); ihre Methoden (Beschreibungen der zulässigen Operationen) sind bereits in dem Schema (der Klassendefinition) festgelegt. Zusätzlich können alle Objekte einer Klasse gewisse Variablen gemeinsam nutzen (Klassenvariable).
Im Implementierungsteil wird präzise ausformuliert, wie die Variablen und Methoden zu realisieren sind. Diesen Teil kann man austauschen, ohne dass es außen bemerkt wird. Was im Inneren der Objekte tatsächlich geschieht, interessiert nur den, der die Objekte implementiert, nicht aber diejenigen, welche die Objekte in ihren Anwendungen einsetzen. Vom Aufbau her besitzen Klassen und Objekte also große Ähnlichkeit mit abstrakten bzw. konkreten Datentypen.
Beispiele: Der Objektbegriff wird oft auch anhand des Luftdrucks erläutert, der in einem geschlossenen Gefäß herrscht. Das Modell besteht aus n Objekten (den Molekülen des Gases), die Instanzen der gleichen Klasse sind, und aus einem Objekt, das die Gefäßwand repräsentiert. Die einzelnen Objekte im Inneren des Gefäßes tauschen durch Zusammenstoßen Nachrichten untereinander aus: Geschwindigkeit, Richtung und jeweilige Stärke des Objekts werden hierbei wechselseitig mitgeteilt. Zugleich teilen die Objekte, die an die Gefäßwand stoßen, der Gefäßwand ihre Kenngrößen in Form einer Nachricht mit.
Die Reaktionen der einzelnen Objekte auf diese Nachrichten sind: Die Moleküle ändern hierbei ihren Zustand, d. h. ihre aktuellen Werte für Geschwindigkeit und Richtung. Die Gefäßwand besitzt die Methode, alle Einzelnachrichten aufzusummieren und diesen Gesamtwert an ein Objekt Messvorrichtung weiterzugeben, welches ihn als Luftdruck anzeigt. Nach diesem Modell kann man viele Naturvorgänge beschreiben, auch wenn man sie wegen der ungeheueren Vielfalt nicht simulieren kann.
Ein anderes Beispiel sind Skatspieler: Man definiert eine Klasse Skatspieler und als Unterklasse hiervon die Klasse Skatspieler mit eigener Strategie; Skatspieler sind dann Instanzen dieser Unterklasse. Hinzu kommt ein Objekt Tisch, welches die Karten verteilt, die sichtbaren und abgelegten Karten verwaltet und die Punkte anschreibt.
Programmieren bedeutet aus objektorientierter Sicht nun: Man beschreibe Klassen von Objekten mit Hilfe der genannten Schemata, man kreiere konkrete Objekte (Instanzen) mittels der Operation new, und dann schicke man einem Objekt eine Nachricht, damit es eine Methode ausführe, um eine Aufgabe zu lösen. Dieses Objekt wird weiteren Objekten Nachrichten zur Lösung von Teilaufgaben schicken und deren Antworten werden die gestellte Aufgabe bearbeiten und schließlich eine Lösung zurückgeben.
Das objektorientierte Programmieren führt zu einer anderen Form der Programmierung: Probleme werden nicht dadurch gelöst, dass man die Lösung von Grund auf neu entwickelt, sondern man versucht, aufbauend auf einem Grobkonzept, Klassen zu finden, deren Zusammenwirken möglicherweise die Fragestellung lösen kann. Zu diesen Klassen werden dann Unterklassen konstruiert, die speziell auf die Problemstellung zugeschnitten sind.
Auf diese Weise erhält man frühzeitig ein erstes lauffähiges System (Prototyping), und das gewünschte Programmsystem entsteht durch schrittweises Annähern dieses Prototyps an die Erfordernisse. Man spricht deshalb von Konfigurieren als zentraler Vorgehensweise und von evolutionärer Systementwicklung.
Beispiel zur OOP anhand von LEGO-Steinen
LEGO-Steine sind kleine Plastikblöcke, die in unterschiedlichsten Farben und Größen verkauft werden. Diese Steine haben kleine, runde Noppen auf der einen Seite, die fest in die entsprechenden Löcher anderer Steine passen. Über Kombinationen dieser Steine lassen sich größere Formen erzeugen. Es gibt viele verschiedene LEGO-Teile, wie z.B. Räder, Motoren, Gelenke und Flaschenzüge, die man dazu verwenden kann.
Mit LEGO-Bausteinen kann man alle möglichen Dinge bauen: Burgen, Autos, lange Anhänger, Hosenträger, Sportkleidung... einfach alles, was man sich vorstellen kann. Jedes LEGO-Steinchen ist ein Objekt, das mit anderen Objekten auf eine ganz bestimmte Art zusammenpasst, um ein größeres Objekt zu erzeugen.
Sobald man die Interaktion zwischen den einzelnen Komponenten kennt und die entsprechenden Voraussetzungen dafür geschaffen hat, ist es einfach, das Gesamtsystem zusammenzusetzen.OOP hat sehr viel Ähnlichkeit mit dem Aufbau von Strukturen mit LEGO-Steinen. Bei der OOP baut man die Gesamtprogramme aus unterschiedlichen Komponenten auf, die Objekte genannt werden.
Deklaration von Variablen
In der Informatik bezeichnet man als Variable meist einen logischen Speicherplatz mit dessen Wert (imperative Programmiersprache). Logischer Speicherplatz ist hier im Gegensatz zu physikalischer Speicherplatz zu verstehen:
Bei einer Variablen will man sich nicht darum kümmern müssen, wie viele Speicherzellen sie in einem Speicher belegt und wo sie im Speicher steht. Jede Variable besitzt einen Namen, unter dem man sie ansprechen und ihren Wert verändern kann.
In vielen typisierten Programmiersprachen muss einer Variablen ein Datentyp zugeordnet werden. Der Datentyp legt fest, welche Elemente als Werte der Variablen auftreten und welche Operationen auf die Variable angewendet werden dürfen. Variablen werden im Deklarationsteil einer Programmeinheit (Block, Prozedur, Modul usw.) vereinbart. Sie existieren, solange die Programmeinheit nicht verlassen wird, und sie sind sichtbar in allen Unterprogrammeinheiten, in denen der Name nicht umdefiniert wurde
Einfache Datentypen zur Deklaration von Variablen
Ein Grundlegender Begriff in der Informatik ist der Datentyp. Unter einem Datentyp versteht man die Zusammenfassung von Wertebereichen und Operationen zu einer Einheit.
Liegt der Schwerpunkt auf den Eigenschaften, die die Operationen und Wertebereiche besitzen, dann spricht man von abstrakten Datentypen.
Steht dagegen die Darstellung in einer Programmiersprache im Vordergrund, so handelt es sich um konkrete Datentypen.
Datentypen, bei denen die Operationen auf solche Operationen eingeschränkt sind, die nur den Aufbau der Wertebereiche betreffen (Zugriffsoperationen, Zusammensetzungsoperationen, Elementbeziehungen), bezeichnet man als Datenstrukturen, jedoch verbindet man mit Datenstrukturen oft auch weitere Operationen wie Löschen, Verändern, Aneinanderfügen, Größe usw.
Datenstruktur :
Die Bezeichnung Datenstruktur wird oft gleichbedeutend mit Datentyp verwendet. Man spricht z. B. von den Datenstrukturen Keller, Schlange, Baum, B-Baum usw.
Im engeren Sinne versteht man unter Datenstrukturen den Aufbau von Wertebereichen aus elementaren Wertebereichen mit Hilfe von Konstruktoren. Elementare Wertebereiche sind die ganzen Zahlen (integer), die reellen Zahlen (real), die Menge der Wahrheitswerte (boolean), die Menge der Zeichen (char), selbstdefinierte endliche Mengen (Aufzählungstypen) und Unterbereiche hiervon. Die Konstruktoren dienen dazu, die Struktur der Wertebereiche und die Zusammensetzung bzw. Zerlegung ihrer Elemente festzulegen.
Der Datentyp legt nicht nur fest, wie der Wert der Variablen zu interpretieren ist, er gibt auch an, wie groß der für die Variable bereitzustellende Speicherbereich sein muss.
Datentyp Beschreibung Wertebereich boolean boolescher Wert true, false (wahr, falsch) char Zeichen, Buchstabe Unicode-Werte byte ganze Zahl -128 bis +127 short ganze Zahl -32768 bis 32767 int ganze Zahl -2.147.483.648 bis +2.147.483.647 long ganze Zahl -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 float Fließkommazahl -3,40282347E+38 bis +3,40282347E+38 double Fließkommazahl -1,7976931348623157E+308 bis +1,7976931348623157E+308 |
1.2.2 Beispiel für Datentypen zur Deklaration von Variablen
int ganze_Zahl; ganze_Zahl =3444; double krumme_Zahl; krumme_Zahl = 47.11; boolean ja,nein,oder_doch; Buchstabe = `Ü´; boolean Antwort; Ziffer = ‘4´; short klein = -4; Antwort = true; char Buchstabe; char Ziffer; |
Wie man an den Beispielen sehen kann, kann man auch mehrere Variablen des gleichen Typs durch Komma getrennt auf einmal deklarieren, und es ist sogar erlaubt, eine Variable direkt im Zuge ihrer Deklaration zu initialisieren, d.h, ihr einen Wert zuzuweisen (siehe short klein =-4).
1.2.3 Initialisierung von Variablen
Als Initialisierung bezeichnet man die anfängliche Zuweisung eines Wertes an eine Variable. Die Initialisierung erfolgt meist im Zuge der Deklaration oder kurz danach, um zu verhindern, dass man den Wert einer Variablen ausliest, der zuvor kein vernünftiger Wert zugewiesen wurde.
Wie in diesem Beispiel zu sehen ist, dürfen Variablen gleich bei der Deklaration initialisiert werden. Dazu ist einfach der gewünschte Wert hinter einem Zuweisungsoperator an die Deklaration anzuhängen:
char b = 'x';
double c = 3.1415;
boolean d = false;
Oder die Variable wird kurz nach der Deklaration initialisiert, wie in folgendem Beispiel:
int a;
a = 1;
Die Zugriffsklassen erlauben die gezielte Vergabe von Zugriffsrechten, und zwar einzeln für jede Methode und jedes Datenelement. Folgende Zugriffsklassen sind in Java definiert:
public
Die Zugriffsklasse public erlaubt »weltweiten« Zugriff. Es kann sowohl von außen als auch von allen Unterklassen aus auf das Datenelement oder die Methoden zugegriffen werden.
Verlag: BookRix GmbH & Co. KG
Tag der Veröffentlichung: 27.07.2018
ISBN: 978-3-7438-7609-5
Alle Rechte vorbehalten
Widmung:
Dieses Buch widme ich meinen Enkelkindern Emi, Tommy ud Yannik