Programmierkurs Java 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) #2 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 #3 Objektorientierung • Objekte der realen Welt werden im Code modelliert • Beispiel „elektronischer Busfahrplan“ – – – – – – Fahrgäste Tarifzonen Busse Fahrer Haltestellen Usw. #4 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 Beispiel: Objekt „Punkt“ • Besteht aus Zustand (Attributen) und Verhalten (Methoden) Punkt Attribute: - double x = 1; - double y = 3; • Zustand eines Punktes – Definiert durch aktuelle x- und y- Werte 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 #6 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); #7 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); #8 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“ #9 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 ... Attribute des Objektes p1 der Klasse Punkt x1 Attribute des Objektes p2 der Klasse Punkt x2 Attribute des Objektes p3 der Klasse Punkt x3 y1 y2 y3 ... #10 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 #11 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 „this“-Pointer von p1 x1 y1 „this“-Pointer von p2 x2 y2 „this“-Pointer von p3 x3 y3 ... #12 Klassen in Java 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 #14 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 #15 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 { } #16 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 ); #17 Verwendung von Attributen #18 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) { … } } #19 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); #20 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 #21 Ü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); #22