Programmierkurs Java - Universität zu Lübeck

Werbung
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
Herunterladen