Einstieg OO (Objekt-Orientierung) mit Java
1. Erste Klärungen
1.1. Programmieren und Programme (Software)
Programmieren ist das Herstellung von mehrfach nutzbaren Funktionalitäten auf Basis flexibel konfigurierbarer Hardware.
Die Komplexität dieser Funktionalitäten ist potentiell sehr groß (Computerspiel, Textverbarbeitung, Zeichenprogramme, etc.), der Erstellungsaufwand wird eher in Mann-Monaten oder Mann-Jahren formuliert. Viele komplexe, häufig benutzte Programme sind das Ergebnis 10-100 (oder mehr) Mannjahre Programmier-Aufwand.
Um so komplexe Produkte erstellen zu können, wurden in den letzten 60 Jahren viele Konzepte und Werkzeuge entwickelt.
Unvermeidbar gehört zum Programmieren auch das Lesen und Verfassung von Dokumentation. Ebenso unvermeidbar ist das Testen - praktisch KEIN Programm ist fehlerfrei! Es gibt auch dafür eigene Verfahren und Werkzeuge. Programmiersprache
Programme werden in sogenannten "Programmiersprachen" formuliert, das sind formal exakt definierte, dem menschlichen Denken gut angepasste Notationen (fast immer) in Text-Form (sinnvollerweise in Computer-Dateien gespeichert).
Diese Texte werden "Quell-Code" oder "Source-Code" genannt und werden nach Prüfung auf Einhaltung der festgelegten Grammatik/Syntax mit einem "Compiler"-Programm (oder bei Script-Sprachen "Interpreter") in ein "Binär-Format" umgewandelt, das der Computer mithilfe des Betriebssystems und oft einer spezifischen Software-Infrastruktur (Laufzeitumgebung, Virtuelle Maschine, Standard-Bibliotheken) ausführen kann.
Es gibt sehr viele Programmiersprachen, viele davon objektorientiert. Wir verwenden Java (objektorientiert, sehr viel verwendet - z.B. Hauptsprache in Android).
Wichtige Elemente aller Programmiersprachen sind Variable und "Funktionen" (enthalten Algorithmen, um gewünschte Ergebnisse zu erreichen).
Oft wird zur Darstellung der logischen Struktur von Programmen auch grafische Notation in je nach Aspekt unterschiedlicher Form verwendet.
Zur Erstellung von Source-Code, probeweisem Ausführen und Analysieren des Ablaufes gibt es spezialisierte Software-Werkzeuge - im einfachsten Fall leistungsfähige Text-Editoren oder sogenannte IDEs (Integrated Development Environment).
Wichtige Hilfsmittel, die solche Werkzeuge teils automatisch anwenden, sind:
-
automatische Formatierung
-
Verwendung von Farben zur Erleichterung der Struktur-Wahrnehmung (Syntax-Highlighting)
-
Auswahllisten passender Elemente
-
Automatische Vervollständigung
-
Automatisches Übersetzen (Compilieren) und Ausführen des Programms oder des gewünschten Teilstückes
-
Schrittweises Ausführen des Programms und Anzeige des gerade auszuführenden Kommandos/Statements und der aktuellen Variablenwerte (Debugging)
-
etc.
1.2. Kontakt mit Real-Welt
Wir haben Kontakt mit der Real-Welt zu erheblichen Teilen über visuell wahrnehmbare Objekte - Autos, Menschen, Tiere, Äpfel, Hosenknöpfe, etc. - kompakte, stückhafte, abzählbare Phänomene der Wirklichkeit. Daneben mit Kontinuen - Flüssigkeiten, Gasen, etc., und natürlich mit Phänomenen, wo der Ereignis-Aspekt (Knall, Begegnung, ..), der Vorgang (schnelle Bewegung, …) oder der direkte Eindruck unserer anderen Sinnesorgane dominiert (Schall, etc.).
Programmieren versucht sich nach den Konzepten der menschlichen Erfahrungswelt zu strukturieren.
1.3. Strukturierung nach Objekten
Realwelt-Objekte sind uns besonders gut analytisch zugänglich, sie haben oft relativ stabile Eigenschaften (Farbe, Gewicht, Größe, Form, etc.). Auch die natürliche Sprache ist in beachtlichem Ausmaß objektorientiert - wir können auch Vorgänge und Eigenschaften als Objekte betrachten (Das Laufen, Farbe Grün, die Größe, …). Daher hat sich in den letzten Jahrzehnten die "Objektorientierte Softwareentwicklung" sehr stark verbreitet. Auch wir werden gleich von Beginn weg nach diesem Prinzip arbeiten. Hierbei wird bei der Software-Entwicklung auf oberster Ebene die Objektnatur verwendet, diesen Objekten werden Eigenschaften und mögliche Aktivitäten zugeordet. Ein Programm besteht fast immer aus mehreren (oft SEHR vielen) Objekten, die voneinander "wissen" und interagieren können.
1.4. Reduktionistisches Modell
Software interessiert sich NIE für ein Objekt in seiner gesamten Fülle und Komplexität, sie wird immer zur Umsetzung eines relativ konkreten Vorhabens geschrieben - eine Schülerverwaltung interessiert sich nicht für die molekulare Struktur jedes Schülers, sondern für seine (wenigen) verwaltungsrelevanten Eigenschaften und Beziehungen wie Name, Geburtsdatum, aktuelle Schulklasse, Adresse, Eltern, Erreichbarkeit etc. Es wird daher beinahe immer ein stark reduktionistisches Modell von Realwelt-Objekten erstellt und mit diesem gearbeitet. (siehe auch Computerspiele - hier sind die "Helden" nur sehr eingeschränkt definiert und können nur wohldefinierte Aktivitäten vollbringen bzw. Zustände einnehmen (besiegt, zerstört, Energievorrat-Status, etc.)
2. Klassen
2.1. Überblick
Wir nutzen dabei in den meisten Programmiersprachen auch das Konzept von Begriffen - Abstraktionen über Mengen ähnlich strukturierter, konkreter Objekte:
-
Waldi, Bello, Fiffi → Hund
-
mein roter Ferrari, dein gelber BMW, Mutters grüner Toyota → Auto
Solche Begriffe werden "Klasse" genannt. Sie definieren die für uns gerade interessanten Eigenschaften der Objekte und die möglichen Aktivitäten.
Programmtechnisch können dann mit einer solchen Klasse beliebig viele Ojekte einer gewünschten Klasse erzeugt werden (man nennt das auch "Instanzieren", das entstandene Objekt auch "Instanz" (= Exemplar).
Klassen kann man sich auch als "Bauplan" der aus ihnen erzeugbaren Objekte vorstellen.
Sie definieren, welche Eigenschaften (und "Assoziationen" … "stabile" direkte Beziehungen) die erzeugten Objekte haben. Weiters definieren sie, welche Aktivitäten/Funktionalitäten die erzeugten Objekte "können".
2.2. Beispiel: Klasse Person
könnte folgende Eigenschaften haben:
Nachname Vorname Geburtsjahr Geschlecht
und folgende Funktionalitäten:
Zuordnen der Personendaten Berechnung des Alters Zusammenbauen des vollen Namens (<Vorname> <Nachname>) Anzeige der Personendaten samt vollem Namen und Alter am Bildschirm
3. Objekte
Nachdem eine Klasse "implementiert" ist (der Source-Code syntaxfehlerfrei geschrieben ist), können daraus beliebig viele Objekte mit diesem Aufbau erzeugt werden (tatsächlich erzeugt werden sie eigentlich erst zur Laufzeit des Programms und liegen dann "irgendwo" im Hauptspeicher des Computers!). Jedes Objekt hat dabei eigenen Speicherplatz für die im Bauplan vorgesehenen Eigenschaften, sodass jedes Objekt individuelle Eigenschaftswerte besitzt und eine eigene "Identität" hat.
4. Fachbegriffe
Klassen entsprechen dem Begriff (Waldi der Nachbarin → Hund) in der Alltagssprache, im Programmieren kann man sie sich als Bauplan bzw. "Gussform" für seine Objekte vorstellen
Objekte werden auch Instanzen (Exemplare) der zugehörigen Klasse genannt. Sie sind zur Laufzeit nach (dynamischer) Erzeugung an einer bestimmten Stelle des Hauptspeichers vorhanden. Der Zustand zu einem Zeitpunkt ist durch die Kombination aller Eigenschafts-Werte für jedes Objekt individuell gegeben. Jedes Objekt hat eine Identität (durch die jeweils eindeutige Position im Hauptspeicher) und kann auch individuell "angesprochen" werden.
Eigenschaften werden auch Properties, Attribute oder (etwas salopp) Instanzvariable, Felder, Fields genannt. Diese sind für alle Objekte der selben Klasse zur Laufzeit als gleichartige Struktur im Hauptspeicher vorhanden, haben aber für jedes Objekt individuelle Werte.
Funktionalitäten von Objekten werden meistens (Instanz-)Methoden genannt. Solche Methoden werden immer für ein bestimmtes Objekt aufgerufen und können daher auf alle Eigenschaftswerte genau dieses Objekts zugreifen.
Später werden wir auch Funktionalitäten, die NICHT an einzelnen Objekten wirken, kennenlernen (Klassen-Methoden).