Objektorientierte Programmierung

Ähnliche Dokumente
Objektorientierte Programmierung

Objektorientierte Programmierung

Objektorientierte Programmierung

1 Klassen und Objekte

Eine Klassen-Deklaration besteht folglich aus Deklarationen von:

Objektorientierte Programmierung

12 Abstrakte Klassen, finale Klassen und Interfaces

Implementieren von Klassen

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

14 Abstrakte Klassen, finale Klassen, Interfaces

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Einstieg in die Informatik mit Java

14 Abstrakte Klassen, finale Klassen, Interfaces

7. Objektorientierung. Informatik II für Verkehrsingenieure

Einstieg in die Informatik mit Java

Repetitorium Informatik (Java)

Objektorientierte Programmierung und Klassen

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Objektorientierung

Programmiertechnik Objektorientierung

II. Grundlagen der Programmierung. Beispiel: Merge Sort. Beispiel: Merge Sort (Forts. ) Beispiel: Merge Sort (Forts. )

Polymorphie. Überladen. Definition Methodennamen überladen Konstruktoren überladen Operatoren überladen Beispiele. Dr.

Methoden und Wrapperklassen

Kapitel 10. Verweise und Referenzen. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

3 Objektorientierte Konzepte in Java

14. Java Klassen. Klassen, Typen, Objekte, Deklaration, Instanzierung, Konstruktoren, statische Felder und Methoden, Datenkapselung

Einstieg in die Informatik mit Java

Überblick. Peer Kröger (LMU München) Einführung in die Programmierung WS 14/ / 492

1 Abstrakte Datentypen

Objektorientierte Programmierung

Programmieren in Java

14. Java Klassen. Klassen (Java) vs. Records (Pascal) Klassen - Konzeptuell. Klassen - Technisch

Tag 7 Repetitorium Informatik (Java)

Objektorientierte Programmierung Studiengang Medieninformatik

Philipp Güttler Objektorientierung und komplexe Datentypen

Einstieg in die Informatik mit Java

Konstruktor. public Rational(int i) { Zaehler = i; Nenner = 1; }

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

III. Objektorientierte Programmierung. Aufruf einer Methode. Definition einer Methode. Bezug zur aufrufenden Instanz. Instanzen einer Klasse

Einstieg in die Informatik mit Java

C++ - Objektorientierte Programmierung Vererbung

EINI LW/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 16/17

Einführung in die Programmierung für NF MI. Übung 07

Objektorientierte Programmierung Studiengang Medieninformatik

Algorithmen und Datenstrukturen 06

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Programmiertechnik Klassenvariablen & Instantiierung

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Einstieg in die Informatik mit Java

Programmieren in Java

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

ADT: Verkettete Listen

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Objektorientierte Programmierung Studiengang Medieninformatik

Klassenmethoden. Klassenvariablen. Für das Auslesen des Studentenzählers definieren wir eine öffentliche Klassenmethode:

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

Java Einführung Klassendefinitionen

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Einstieg in die Informatik mit Java

Objektorientierung. Klassen und Objekte. Dr. Beatrice Amrhein

Tag 8 Repetitorium Informatik (Java)

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Tafelübung 07 Algorithmen und Datenstrukturen

Allgemeines - Prinzipien

Javakurs für Anfänger

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Einführung in die Programmiersprache Java II

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Universität zu Lübeck Institut für Telematik. Prof. Dr. Stefan Fischer

Algorithmen und Datenstrukturen

Vererbung, Polymorphie

Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen. J. W. v. Goethe.

Einführung in die Programmierung mit C++

Java für Bauingenieure

Probeklausur: Programmierung WS04/05

Objektorientierung (OO)

7. Klassenmethoden Einführung in die Programmierung (fbw) Sommersemester 2008 Prof. Dr. Bernhard Humm Hochschule Darmstadt, fbi

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung

Vererbung und Polymorphie

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

Klassen als Datenstrukturen

11 Abstrakte Datentypen

Einführung in die Java- Programmierung

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 14.1.

Einführung in die Programmiersprache Java II

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Begriffe 1 (Wiederholung)

// Objekt-Methoden: public void insert(int x) { next = new List(x,next); } public void delete() { if (next!= null) next = next.next; } public String

Klassenvariablen, Klassenmethoden

Transkript:

Objektorientierte Programmierung Bis jetzt kennen wir (fast) nur primitive Datentypen. Diese entsprechen weitestgehend der Hardware des Rechners (z.b. besitzt ein Rechner Hardware um zwei floats zu addieren). Wir möchten Dinge der realen Welt modellieren, dafür benötigen wir komplexere Datentypen. Lösung: selbstdefinierte Datentypen 30. Jan. 2018 Felix Brandt, Harald Räcke 202/596

Objektorientierte Programmierung Angenommen wir möchten eine Adressverwaltung schreiben. Dazu müßten wir zunächst eine Adresse modellieren: Harald Räcke Boltzmannstraße 3 85748 Garching Adresse + Name : String + Strasse : String + Hausnummer : int + Postleitzahl : int + Stadt : String Zumindest für diesen Fall ist die Modellierung sehr einfach. Datentyp ist hier nur eine Komposition (Zusammensetzung) von anderen einfacheren Grundtypen.

Objektorientierte Programmierung Angenommen wir möchten eine Adressverwaltung schreiben. Dazu müßten wir zunächst eine Adresse modellieren: Harald Räcke Boltzmannstraße 3 85748 Garching Adresse + Name : String + Strasse : String + Hausnummer : int + Postleitzahl : int + Stadt : String Zumindest für diesen Fall ist die Modellierung sehr einfach. Datentyp ist hier nur eine Komposition (Zusammensetzung) von anderen einfacheren Grundtypen.

Objektorientierte Programmierung Wie benutzt man den Datentyp? Geht aus der Ansammlung der Grundtypen nicht hervor. Wenn der Datentyp sehr komplex ist (Atomreaktor), kann man leicht Fehler machen, und einen ungültigen Zustand erzeugen.

Objektorientierte Programmierung Wie benutzt man den Datentyp? Geht aus der Ansammlung der Grundtypen nicht hervor. Wenn der Datentyp sehr komplex ist (Atomreaktor), kann man leicht Fehler machen, und einen ungültigen Zustand erzeugen. Grundidee: Ändere Variablen des Datentyps nur über Funktionen/Methoden. Falls diese korrekt implementiert sind, kann man keinen ungültigen Zustand erzeugen. Daten und Methoden gehören zusammen (abstrakter Datentyp)

Objektorientierte Programmierung Ein (abstrakter) Datentyp besteht aus Daten und einer Menge von Methoden (Schnittstelle) um diese Daten zu manipulieren. Datenkapselung / Information Hiding Die Implementierung des Datentyps wird vor dem Benutzer versteckt. minimiert Fehler durch unsachgemäßen Zugriff Entkopplung von Teilproblemen gut für Implementierung, aber auch Fehlersuche und Wartung erlaubt es die Implementierung später anzupassen ( rapid prototyping) erzwingt in der Designphase über das was und nicht über das wie nachzudenken... 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 205/596

Objektorientierte Programmierung Generalisierung + Vererbung Identifiziere Ähnlichkeiten zwischen Datentypen und lagere gemeinsame Teile in einen anderen Datentyp aus. Atomreaktor Siedewasserreaktor Druckwasserreaktor vermeidet Copy&Paste... verringert den Wartungsaufwand... 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 206/596

Objektorientierte Programmierung Klasse = Implementierung eines abstrakten Datentyps Objekt = Instanz/Variable einer Klasse 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 207/596

Beispiel: Rationale Zahlen Eine rationale Zahl q Q hat die Form x y, wobei x, y Z. x und y heißen Zähler und Nenner von q. Ein Objekt vom Typ Rational sollte deshalb als Komponenten int-variablen zaehler und nenner erhalten: Zähler Nenner Die Daten eines Objektes heißen Instanz-Variablen oder Attribute. 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 208/596

Beispiel: Rationale Zahlen Rational name; deklariert eine Variable für Objekte der Klasse Rational. Das Kommando new Rational(...) legt das Objekt an, ruft einen Konstruktor für dieses Objekt auf, und liefert einen Verweis auf das neue Objekt zurück. a a = new Rational(2,3); a Zähler Nenner 2 3 Der Konstruktor ist eine Prozedur, die die Attribute des neuen Objektes initialisieren kann.

Erinnerung: Referenzen Der Wert der Rational-Variablen ist eine Referenz/Verweis auf einen Speicherbereich. Rational b = a; kopiert den Verweis aus a in die Variable b: a Zähler Nenner 2 3 Rational b = a; a Zähler Nenner 2 3 b 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 210/596

Beispiel: Rationale Zahlen a.zaehler liefert den Wert des Attributs zaehler des Objektes auf das a verweist: a Zähler Nenner 2 3 int b = a.zaehler; a Zähler Nenner 2 3 b 2 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 211/596

Beispiel: Rationale Zahlen a.add(b) ruft die Operation add für a mit dem zusätzlichen aktuellen Parameter b auf: a Zähler Nenner 2 3 a Zähler Nenner 2 3 Rational c = a.add(b); b Zähler Nenner 1 12 b Zähler Nenner 1 12 c Zähler Nenner 9 12 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 212/596

Beispiel: Rationale Zahlen a Zähler Nenner 2 3 a Zähler Nenner 2 3 a = a.add(b); b Zähler Nenner 1 12 b Zähler Nenner 1 12 Zähler Nenner 9 12 Die Operationen auf Objekten einer Klasse heißen auch Methoden, genauer: Objekt-Methoden. 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 213/596

Zusammenfassung Eine Klassendeklaration besteht folglich aus: Attributen für die verschiedenen Wertkombinationen der Objekte; Konstruktoren zur Initialisierung der Objekte; Methoden, d.h. Operationen auf Objekten. Diese Elemente heißen auch Members der Klasse. 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 214/596

Implementierung 1 public class Rational { 2 // Attribute: 3 private int zaehler, nenner; 4 // Konstruktoren: 5 public Rational(int x, int y) { 6 zaehler = x; 7 nenner = y; 8 } 9 public Rational(int x) { 10 zaehler = x; 11 nenner = 1; 12 } 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 215/596

Implementierung 13 // Objekt-Methoden: 14 public Rational add(rational r) { 15 int x = zaehler * r.nenner + r.zaehler * nenner; 16 int y = nenner * r.nenner; 17 return new Rational(x,y); 18 } 19 public boolean isequal(rational r) { 20 return zaehler * r.nenner == r.zaehler * nenner; 21 } 22 public String tostring() { 23 if (nenner == 1) return "" + zaehler; 24 if (nenner > 0) return zaehler +"/"+ nenner; 25 return (-zaehler) +"/"+ (-nenner); 26 } 27 public static Rational[] inttorationalarray(int[] a) { 28 Rational[] b = new Rational[a.length]; 29 for(int i=0; i < a.length; ++i) 30 b[i] = new Rational(a[i]); 31 return b; 32 }

Implementierung 33 // Jetzt kommt das Hauptprogramm 34 public static void main(string[] args) { 35 Rational a = new Rational(1,2); 36 Rational b = new Rational(3,4); 37 Rational c = a.add(b); 38 39 System.out.println(c.toString()); 40 } // end of main() 41 } // end of class Rational 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 217/596

Implementierung Bemerkungen: Jede Klasse sollte in einer separaten Datei des entsprechenden Namens stehen. Die Schlüsselworte public bzw. private klassifizieren, für wen die enstprechenden Members sichtbar, d.h. zugänglich sind. private heißt: nur für Members der gleichen Klasse sichtbar. public heißt: innerhalb des gesamten Programms sichtbar. Nicht klassifizierte Members sind nur innerhalb des aktuellen Package sichtbar. 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 218/596

Implementierung Bemerkungen: Konstruktoren haben den gleichen Namen wie die Klasse. Es kann mehrere geben, sofern sie sich im Typ ihrer Argumente unterscheiden. Konstruktoren haben keine Rückgabewerte und darum auch keinen Rückgabetyp. Methoden haben dagegen stets einen Rückgabe-Typ, evt. void. 1 public void inc(int b) { 2 zaehler = zaehler + b * nenner; 3 } 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 219/596

Implementierung Die Objekt-Methode inc() modifiziert das Objekt, für das sie aufgerufen wird. a Zähler Nenner 3 4 a.inc(1); a Zähler Nenner 7 4 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 220/596

Implementierung Die Objektmethode isequal() ist nötig, da der Operator == bei Objekten die Identität der Objekte testet, d.h. die Gleichheit der Referenz!!! Die Objektmethode tostring() liefert eine String-Darstellung des Objekts. Sie wird implizit aufgerufen, wenn das Objekt als Argument für die Konkatenation + auftaucht. Innerhalb einer Objektmethode/eines Konstruktors kann auf die Attribute des Objektes direkt zugegriffen werden. private-klassifizierung bezieht sich auf die Klasse nicht das Objekt: die Attribute aller Rational-Objekte sind für add sichtbar!!!

UML-Diagramm Eine graphische Visualiserung der Klasse Rational, die nur die wesentliche Funktionalität berücksichtigt, könnte so aussehen: Rational zaehler : int nenner : int + add (y : Rational) : Rational + isequal (y : Rational) : boolean + tostring () : String 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 222/596

Diskussion und Ausblick Solche Diagramme werden von der UML, d.h. der Unified Modelling Language, bereitgestellt, um Software-Systeme zu entwerfen ( Software Engineering) Für einzelne Klassen lohnt sich ein solches Diagramm nicht wirklich. Besteht ein System aber aus sehr vielen Klassen, kann man damit die Beziehungen zwischen den Klassen verdeutlichen. Achtung: UML wurde nicht speziell für Java entwickelt. Darum werden Typen abweichend notiert. Auch lassen sich manche Ideen nicht oder nur schlecht modellieren. 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 223/596

Diskussion und Ausblick Solche Diagramme werden von der UML, d.h. der Unified Modelling Language, bereitgestellt, um Software-Systeme zu entwerfen ( Software Engineering) Für einzelne Klassen lohnt sich ein solches Diagramm nicht wirklich. Besteht ein System aber aus sehr vielen Klassen, kann man damit die Beziehungen zwischen den Klassen verdeutlichen. Achtung: UML wurde nicht speziell für Java entwickelt. Darum werden Typen abweichend notiert. Auch lassen sich manche Ideen nicht oder nur schlecht modellieren. 10 Klassen und Objekte 30. Jan. 2018 Felix Brandt, Harald Räcke 223/596

10.1 Selbstreferenzen 1 public class Cyclic { 2 private int info; 3 private Cyclic ref; 4 // Konstruktor 5 public Cyclic() { 6 info = 17; 7 ref = this; 8 } 9... 10 } // end of class Cyclic Innerhalb eines Members kann man mit Hilfe von this auf das aktuelle Objekt selbst zugreifen! 10.1 Selbstreferenzen 30. Jan. 2018 Felix Brandt, Harald Räcke 224/596

10.1 Selbstreferenzen Für Cyclic a = new Cyclic(); ergibt das a 10.1 Selbstreferenzen 30. Jan. 2018 Felix Brandt, Harald Räcke 225/596

10.1 Selbstreferenzen Für Cyclic a = new Cyclic(); ergibt das a info ref 17 10.1 Selbstreferenzen 30. Jan. 2018 Felix Brandt, Harald Räcke 225/596

10.1 Selbstreferenzen Für Cyclic a = new Cyclic(); ergibt das a info ref 17 10.1 Selbstreferenzen 30. Jan. 2018 Felix Brandt, Harald Räcke 225/596

10.1 Selbstreferenzen Für Cyclic a = new Cyclic(); ergibt das a info ref 17 10.1 Selbstreferenzen 30. Jan. 2018 Felix Brandt, Harald Räcke 225/596

Modellierung einer Selbstreferenz Cyclic info : int ref 1 1 Die Rautenverbindung heißt auch Aggregation Das Klassendiagramm vermerkt, dass jedes Objekt der Klasse Cyclic einen Verweis mit dem Namen ref auf ein weiteres Objekt der Klasse Cyclic enhält. Ausserdem, dass jedes Cyclic-Objekt in genau einem anderen Cyclic-Objekt die Rolle ref übernimmt. 10.1 Selbstreferenzen 30. Jan. 2018 Felix Brandt, Harald Räcke 226/596

Die this-referenz Woher kommt die Referenz this? Einem Aufruf einer Objektmethode (z.b. a.inc()) oder eines Konstruktors wird implizit ein versteckter Parameter übergeben, der auf das Objekt (hier a) zeigt. Die Signatur von inc(int x) ist eigentlich: void inc(rational this, int x); Zugriffe auf Objektattribute innerhalb einer Objektmethode werden mithilfe dieser Referenz aufgelöst, d.h.: zaehler = zaehler + b * nenner; in der Methode inc() ist eigentlich this.zaehler = this.zaehler + b * this.nenner; 10.1 Selbstreferenzen 30. Jan. 2018 Felix Brandt, Harald Räcke 227/596

10.2 Klassenattribute Objektattribute werden für jedes Objekt neu angelegt, Klassenattribute einmal für die gesamte Klasse, Klassenattribute erhalten die Qualifizierung static 1 public class Count { 2 private static int count = 0; 3 private int info; 4 // Konstruktor 5 public Count() { 6 info = count++; 7 } 8... 9 } // end of class Count 10.2 Klassenattribute 30. Jan. 2018 Felix Brandt, Harald Räcke 228/596

10.2 Klassenattribute count 0 Count a = new Count(); 10.2 Klassenattribute 30. Jan. 2018 Felix Brandt, Harald Räcke 229/596

10.2 Klassenattribute count 1 Count b = new Count(); a info 0 10.2 Klassenattribute 30. Jan. 2018 Felix Brandt, Harald Räcke 229/596

10.2 Klassenattribute count 12 Count c = new Count(); a info 0 b info 1 10.2 Klassenattribute 30. Jan. 2018 Felix Brandt, Harald Räcke 229/596

10.2 Klassenattribute count 13 2 a info 0 b info 1 c info 2 10.2 Klassenattribute 30. Jan. 2018 Felix Brandt, Harald Räcke 229/596

10.2 Klassenattribute Das Klassenattribut count zählt hier die Anzahl der bereits erzeugten Objekte. Das Objektattribut info enthält für jedes Objekt eine eindeutige Nummer. Außerhalb der Klasse Class kann man auf die öffentliche Klassenvariable name mit Hilfe von Class.name zugreifen. Funktionen und Prozeduren der Klasse ohne das implizite this-argument heißen Klassenmethoden und werden auch durch das Schlüsselwort static kenntlich gemacht. 10.2 Klassenattribute 30. Jan. 2018 Felix Brandt, Harald Räcke 230/596

Beispiel In Rational definieren wir: public static Rational[] inttorationalarray(int[] a) { Rational[] b = new Rational[a.length]; for(int i=0; i < a.length; ++i) b[i] = new Rational(a[i]); return b; } Die Funktion erzeugt für ein Feld von int s ein entsprechendes Feld von Rational-Objekten. Außerhalb der Klasse Class kann die öffentliche Klassenmethode meth() mit Hilfe von Class.meth(...) aufgerufen werden. 10.2 Klassenattribute 30. Jan. 2018 Felix Brandt, Harald Räcke 231/596