Vorlesung „Programmieren“ Objektorientierte Programmierung Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer Bisher: prozedurale/funktionale Programmierung • Modifikation von Daten über Funktionen • Übergabe von Daten an Funktionen als Parameter • Wesentliche Möglichkeiten – Rückgabe eines neuen Werts (bei call by value) – Modifikation übergebener Parameter (bei call by reference) Security - 04 Cryptology #2 Beispiel: verschiebe und rotiere Punkte • Verschieben – verX = x + deltaX; – verY = y + deltaY; deltaY deltaX • Rotieren – rotX = x * cos(α) - y * sin(α); – rotY = x * sin(α) + y * cos(α); Security - 04 Cryptology #3 Repräsentation eines Punktes • Beispielsweise als 2-elementiges Array – 0-tes Element: x-Wert – 1-tes Element: y-Wert • Beispiel für einen Punkt – double punkt[] = new double[2]; • Wie repräsentiert man nun mehrere Punkte? Security - 04 Cryptology #4 Mehrere Punkte: Array von Arrays • Beispiel für 8 Punkte – double punkte[][] = new double[8][]; – Datentyp von punkte[0]: double[] – Wert von punkte[0],..., punkte[7]: null • Array-Elemente müssen einzeln initialisiert werden – Jedes Array-Element verweist auf ein double-Array • Beispiel: Zuweisung eines neuen 2-elementigen Arrays an jede Position von punkte – for(int i = 0; i < punkte.length; i++) punkte[i] = new double[2]; Security - 04 Cryptology #5 Security - 04 Cryptology #6 Beispiel: • Initialisierung und Wertzuweisung Implementieren von „verschiebe“ • Übergabe des Punktes und der Deltas (x & y) und Modifikation des übergeben Punktes • Parameter punkt ist vom Typ double[] – D.h. Übergabe per call by reference – Nur Referenz (Verweis auf Speicherbereich) auf Parameter wird auf Stack gelegt – Modifikation des Inhalts des Arrays wirkt sich auf das übergebene Array aus • Beispiel – double p[] = new double[2]; – p[0] = 1; p[1] = 1; – verschiebe(p, 1, 1); //p[0] 2; p[1] 2 Security - 04 Cryptology #7 Implementieren von „rotiere“ • Analoges Vorgehen wie bei „verschiebe“ Security - 04 Cryptology #8 Security - 04 Cryptology #9 Demo Das ist ja schon ganz hübsch... • ...aber: kann man das nicht auch „schöner“ programmieren? • Könnte man nicht einen Datentyp „Punkt“ gut gebrauchen? – Anstelle der „Krücke“ mit dem double[][] • Probleme – Man muss wissen, dass am Index 0 der x-Wert ist und am Index 1 der y-Wert – „Jeder“ kann die Werte beliebig manipulieren Security - 04 Cryptology #10 Objektorientierung: Motivation • Notwendig: Bessere Kapselung einzelner Funktionseinheiten – Gruppierung zusammengehöriger Daten und Funktionen – Genaue Steuerung des Zugriffs „von außen“ • Finden der „richtigen“ Funktionseinheiten – z.B. Orientierung an Objekten aus dem erstellten Modell Fachspezialist Programmierer Computer Anwender Objektorientierung • Objekte der realen Welt werden im Code modelliert • Beispiel „elektronischer Busfahrplan“ – – – – – – Fahrgäste Tarifzonen Busse Fahrer Haltestellen Usw. 5-2-12 Definition: Objekt • Repräsentation eines Gegenstandes/Sachverhalts der realen Welt oder eines rein gedanklichen Konzepts • Gekennzeichnet durch – Eindeutige Identität (Unterscheidung von anderen Objekten) (Dieser Punkt vs. der andere Punkt) – Zustand (in Form von Attributen) (also z.B. x- und y-Wert) – Methoden (bisher: Funktionen bzw. Prozeduren) (Manipulation des Zustands; definiert das Verhalten) (Beispiel: verschiebe und rotiere) 5-2-13 Beispiel: Objekt „Punkt“ • Besteht aus Zustand (Attributen) und Verhalten (Methoden) • Zustand eines Punktes – Definiert durch aktuelle x- und y- Werte Punkt Attribute: - double x = 1; - double y = 3; Methoden: - void setze(double x, double y); - void verschiebe(double dx, double dy); - void rotiere(double radians); • Verhalten eines Punktes – Definiert durch seine Methoden – z.B. Setzen der x- und y-Werte, verschieben, rotieren Security - 04 Cryptology #14 Methoden • Können Zustand eines Objektes verändern – Also die Werte der Attribute verändern – Beispielsweise verändert die Methode „rotieren“ die Werte der Attribute x und y – Natürlich können auch Methoden wie Funktionen Parameter haben Punkt Attribute: - double x; - double y; Methoden: - void setze(double x, double y); - void verschiebe(double dx, double dy); - void rotiere(double radians); Security - 04 Cryptology #15 Objekte und Klassen • Muss jedes Objekt immer neu implementiert werden? – Nein, man fasst ähnliche Objekte zu einer Klasse zusammen • Klasse: Abstrakte Definition der Attribute und Methoden einer Menge ähnlicher Objekte Objekte Klasse Punkt X2 y2 X1 y1 Attribute: - double x; - double y; X3 y3 Methoden: - void setze(double x, double y); - void verschiebe(double dx, double dy); - void rotiere(double radians); Security - 04 Cryptology #16 Instanzen • Anstelle von Objekten spricht man oft von „Instanzen“ – Instanzen sind „Realisierungen“ einer Klasse – Instanzen existieren im Arbeitsspeicher – Klassen sind „nur“ abstrakte Definitionen Instanzen der Klasse „Punkt“ X1 y1 X2 y2 X3 y3 Instanzen der Klasse „Lampe“ • Beispiele – – – – Punkte vs. „Dieser Punkt“ Lampen vs. „Diese Wohnzimmerlampe“ Auto vs. „Mein 3er BMW“ Mensch vs. „Ich“ Instanzen der Klasse „Mensch“ Security - 04 Cryptology #17 Objekte / Instanzen und Arbeitsspeicher • • • Jede Instanz einer Klasse (also jedes Objekt) besitzt einen eigenen Speicherbereich für seine Attribute Jedes Objekt/Instanz kann also seine Werte individuell verändern Wie greift ein Objekt auf seine Attribute zu? – Anders gefragt: Woher kennt es seine eigene Adresse? – Eigene Adresse bezeichnet man auch als „Identität“ – Identität: siehe nächste Folie Security - 04 Cryptology ... x1 Attribute des Objektes p1 der Klasse Punkt y1 Attribute des Objektes p2 der Klasse Punkt y2 Attribute des Objektes p3 der Klasse Punkt y3 x2 x3 ... #18 Erzeugung von Instanzen • Instanzen von Klassen werden über new erzeugt • Bisher: double punkt[] = new double[2]; – new double[2]; liefert Adresse des neu erzeugten Arrays auf dem Heap • Jetzt: Punkt punkt = new Punkt(); – new Punkt(); liefert Adresse des neu erzeugten Punkts auf dem Heap – Reserviert einen Speicherbereich für die Attribute des Objekts Security - 04 Cryptology #19 Identität von Objekten • Jedes Objekt besitzt eine eigene Identität • In Form einer Referenz auf den eigenen Speicherbereich Punkt Attribute: - Punkt this; - double x = 1; - double y = 3; Methoden: - void setze(double x, double y); - void verschiebe(double dx, double dy); - void rotiere(double radians); ... • Die sog. „this“-Referenz – Analog zum „ich“ bei Menschen – Quasi ein Verweis auf sich selbst – Im Prinzip ein implizit vorhandenes Attribut vom Typ der Klasse Security - 04 Cryptology Klassen in Java „this“-Pointer von p1 x1 y1 „this“-Pointer von p2 x2 y2 „this“-Pointer von p3 x3 y3 ... #20 Klassen in Java • Benutzerdefinierte, nicht-primitive Datentypen – Bestehen aus Attributen und Methoden – Methoden: Member functions, Klassenfunktionen – Attribute: Member variables • Beispiel – Daten eines Punktes sind x, y vom Typ double – Methoden könnten verschiebe, zeichne, etc. sein 22 Umsetzung in Java • Jede (normale) Klasse wird in einer separaten Datei abgelegt – Dateiname entspricht Klassennamen – Konvention: Großschreibung für Klassenname – Beispiele: Punkt, Mensch, Lampe, Bus, String, ... • Konvention: Kleinschreibung für – primitive Datentypen – Variablen – Methodennamen (Beispiele: byte, short, boolean) (Beispiel: myInt, meinPrivatBus) (Beispiel: oelwechsel(), main(String[] args)) • Jede Klasse mit main()-Methode kann ausgeführt werden – Bisher: Immer eine Klasse ohne Attribute und Methoden 5-2-23 Umsetzung in Java: Klasse • Schlüsselwort: class – In unserem Fall immer: public class { ... } – In der Blockanweisung können Attribute und Methoden definiert werden (später) • Beispiel: – Datei “Punkt.java” : public class Punkt { } – Datei “Mensch.java”:public class Mensch { } Security - 04 Cryptology #24 Umsetzung in Java: Attribute • Syntax: Typ Name; – Typ: Primitiver Datentyp, Array oder Name einer Klasse • Beispiel – public class Punkt { double x; double y; } • Zugriff auf Attribute über Objektreferenz.Attributname – Punkt p = new Punkt(); – p.x = 1; – System.out.println( “p.x = “ + p.x ); 5-2-25 Verwendung von Attributen Security - 04 Cryptology #26 Umsetzung in Java: Methoden • Rückgabetyp Methodenname(Typ1 Name1, T2 N2,…){…} – Wie Funktionen liefern Methoden einen Wert eines bestimmten Datentyps zurück – Ergänzend zu Funktionen können Methoden Attribute lesen und verändern – Vorsicht: Methoden sind nicht „static“ • Beispiel – public class Punkt { void setze(double x, double y) { … } void verschiebe(double dx, double dy) { … } void rotiere(double radians) { … } } Security - 04 Cryptology #27 Aufruf von Methoden • Wie Attribute werden Methoden über eine Objektreferenz angesprochen – Syntax: Objektreferenz.Methodenname(...) • Beispiel – Punkt p = new Punkt(); – p.verschiebe(1.2, 3.4); Security - 04 Cryptology #28 Gesamtbeispiel • Es werden 2 Instanzen der Klasse Punkt erzeugt (p1 und p2) • Es werden Werte an p1.x, p1.y, p2.x und p2.y zugewiesen und dann ausgegeben • Auf dem Objekt p1 werden rotiere und verschiebe aufgerufen • Alle Werte werden erneut ausgegeben • Es haben sich nur die Attribute von p1 geändert 5-2-29 Überladen von Methoden • Mehrere Methoden gleichen Namens in einer Klasse erlaubt – Prinzip der sog. „Überladung“ eines Identifiers / Namens – Gleicher Rückgabetyp, aber unterschiedliche Parameter • Beispiel – void gebeAus(int i); – void gebeAus(String s); – void gebeAus(double d); – gebeAus(1); //Aufruf von void gebeAus(int i); – gebeAus(“Hallo“); //Aufruf von void gebeAus(String s); – gebeAus(2.098); //Aufruf von void gebeAus(double d); Konstruktion von Instanzen Security - 04 Cryptology Initialisierung von Datenstrukturen • Weiteres Problem prozeduraler Programmierung – Initialisierung von Datenstrukturen – Unklare Zuständigkeit • Häufig nur durch Dokumentation ersichtlich – Beispiel: „Beim Verwenden der Datenstruktur Lampe muss zu Beginn die Funktion init_helligkeit(Lampe l); aufgerufen werden“ – Wird häufig vergessen – Führt potenziell zu undefiniertem bzw. ungewolltem Verhalten Wichtiges Prinzip: Konstruktion/Destruktion • Instanzen können bei der Erzeugung automatisch initialisiert werden – Aufruf von speziellen Methoden durch Java – Geschieht bei der Erzeugung mittels new • Diese speziellen Methoden heißen „Konstruktoren“ – Werden automatisch bei der Erzeugung (durch new) aufgerufen – Bringen Instanzen in einen „sicheren“ initialen Zustand • In anderen Programmiersprachen gibt es auch Destruktoren – z.B. Freigeben von Speicher, etc. #31 Konstruktoren: Umsetzung in Java • Konstruktoren: Methoden mit speziellem Namen und Rückgabetyp – Name der Methode: Klassenname – Rückgabetyp: Keiner, nicht einmal void – Konstruktor sollte alle Attribute initialisieren (guter Stil) • Syntax: Klassenname(Typ1 Name1, Typ2 Name2, …) {…} – Beispiel: Punkt(double x, double y) {...} • Eine Klasse kann mehrere Konstruktoren haben – Gleiches Prinzip wie Überladen von Methoden • Ein Konstruktor kann als erstes anderen Konstruktor aufrufen – Syntax: this(...parameter...); Beispiel • Erzeugung von zwei Punkt-Instanzen in main • Zeile 19 – Kein Parameter an den Konstruktor – Aufruf des parameterlosen Konstruktors aus Zeile 6 – Dieser ruft Konstruktor in Zeile 10 auf • Verwendung von „this“ Zeile 20 – Zwei doubleParameter – Aufruf des Konstruktors in Zeile 10 Security - 04 Cryptology Statische Methoden und Attribute #35 Statische Methoden • Methoden verändern den Zustand einer Objektinstanz – bzw. liefern Informationen über deren Zustand • Manchmal praktisch, dieses Modell zu durchbrechen – Main-Methode (Programmstart: keine Instanzen) – Mathematische Funktionen (Wurzel, Sinus, Kosinus, etc.) • Primitive Datentypen sind keine Objekte • new Sinus(1).getWert() 1.sinus() funktioniert nicht zu großer Overhead • Beispiele http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html Statische Methoden und Attribute • Schlüsselwort static (unabhängig von Klasseninstanzen) – Es gibt keine „this“-Referenz (keine Instanz verfügbar) – Statische Elemente können nur andere statische Elemente verwenden – Aufruf anderer statischer Methoden oder Verwenden statischer Variablen • Statische Methoden – Definition: static void statischeMethode(...) {...} – Verwendung: Klassenname.methodenname(Parameter) • Statische Attribute – Definition: static int statischesAttribut; – Verwendung: Klassenname.attributname; 5-3-38 Beispiel: Standardausgabe • System.out.println(“Hallo“); Klasse „System“ Statisches Attribut „out“ Teil der Java KlassenBibliothek Instanz der Klasse PrintStream Methode „println“ Implementiert in PrintStream Beispiel: Quersumme berechnen Beispiel: Instanzzähler Security - 04 Cryptology Beispiel statisch/nicht-statisch #41 Demo: Objektorientiert Security - 04 Cryptology #43 Zusammenfassung • Klassen kapseln Attribute und Methoden – Abstrakte Definition zur Repräsentation einer Menge von Objekten (Instanzen) – Enthalten Attribute und Methoden – Methoden können überladen werden • Objekte (Instanzen) sind Realisierung von Klassen – Jede Instanz hat eigenes Set von Attributen im Speicher – Jede Instanz hat eine Referenz auf sich selbst (this) • Konstruktoren dienen zur Initialisierung von Instanzen – Sind spezielle Methoden die bei new aufgerufen werden – Name ist der der Klasse, kein Rückgabewert • Statische Methoden und Attribute sind nicht an Instanzen gebunden – Existieren genau einmal pro Klasse – Referenz über Klassenname und nicht über Instanzen Security - 04 Cryptology #44