verschiebe und rotiere Punkte

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