Einführung in die Programmierung

Ähnliche Dokumente
Abschnitt 6: Grundlagen der objektorientierten Programmierung

Überblick. 6. Grundlagen der objektorientierten Programmierung 6.1 Abstrakte Datentypen: von Structures zu Klassen 6.2 Das objektorientierte Paradigma

Abschnitt 8: Grundlagen der objektorientierten Programmierung

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

Einführung in die Programmierung

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

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

Objektorientierte Programmierung mit Java. Grundlagen Übersicht. Programmiersprachen

Repetitorium Informatik (Java)

Probeklausur: Programmierung WS04/05

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

Abschnitt 10: Datenstrukturen

Objektorientierte Programmierung (OOP)

Einführung in die Programmierung

Kapitel 6. Grundlagen der objektorientierten Programmierung. Skript zur Vorlesung Einführung in die Programmierung

Einführung in die Programmierung

Einstieg in die Informatik mit Java

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

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

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Prinzipien der objektorientierten Programmierung (OOP)

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

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

Einstieg in die Informatik mit Java

7. Übung Informatik II - Objektorientierte Programmierung

Programmieren in Java

Abschnitt 14: Schnittstellen: Interfaces

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

Tag 8 Repetitorium Informatik (Java)

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

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

11 Vererbung und Klassenhierarchie

Tag 7 Repetitorium Informatik (Java)

Einführung in die Programmiersprache Java II

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

Objektorientierte Programmierung und Klassen

Begriffe 1 (Wiederholung)

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

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Präsentation Interfaces

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

Algorithmen und Programmierung II

Einstieg in die Informatik mit Java

Prozeduren vs. Funktionen

Abschnitt 6: Klassen, Objekte und Methoden in Java

Inhaltsüberblick. I. Grundbegriffe - Objekte und Klassen. Organisatorisches. I. Grundbegriffe - Objektorientierte Konzepte

Programmierkurs Java

Methoden und Wrapperklassen

Einführung in die Programmierung

Einstieg in die Informatik mit Java

Programmieren in Java

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

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

Einstieg in die Informatik mit Java

Letztes Mal. static int ggt(int a, int b) { if (a == b) return a; else if (a > b) return ggt(a-b,b); else if (a < b) return ggt(a,b-a);

Einführung: Verteilte Systeme - Remote Method Invocation -

Konzepte der Programmiersprachen

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

Beuth Hochschule Parameter-Übergabe-Mechanismen WS17/18, S. 1

Algorithmen und Datenstrukturen II

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell

Programmierkurs C++ Abstrakte Klassen und Methoden

Gliederung. Algorithmen und Datenstrukturen II. Java: Objektorientierung. Java: Objektorientierung. Objektorientierung in JAVA. D.

7. Objektorientierung. Informatik II für Verkehrsingenieure

Einführung in die Programmiersprache Java II

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

1 Einleitung Generizität Syntax... 2

Klausur Grundlagen der Programmierung

4.4 Imperative Algorithmen Prozeduren

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Grundlagen der Programmierung in C Klassen

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Implementieren von Klassen

1 Klassen und Objekte

Abschnitt 11: Korrektheit von imperativen Programmen

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

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

Vererbung, Polymorphie

Abschnitt 10: Klassen, Objekte und Methoden in Java

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

14. Java Objektorientierung

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

14. Java Objektorientierung. Klassen, Vererbung, Kapselung

Objektorientierte Programmierung

1. Konzepte Objektorientierter Programmiersprachen

Programmiertechnik Objektorientierung

Geschachtelte Klassen

Einstieg in die Informatik mit Java

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

Java I Vorlesung Vererbung und Sichtbarkeit

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

Abschnitt 9: Schnittstellen: Interfaces

Objektorientierte Modellierung (1)

Objektorientierte Programmierung

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

Transkript:

Einführung in die Programmierung Teil 6: Grundlagen der oo Programmierung Prof. Dr. Peer Kröger, Florian Richter, Michael Fromm Wintersemester 2018/2019

Übersicht 1. Klassen 2. Das objektorientierte Paradigma 3. Klassen und Objekte in Java 4. Aufzählungstypen (Enumerations)

Kapitel 1: Klassen i 1. Klassen 2. Das objektorientierte Paradigma 3. Klassen und Objekte in Java 4. Aufzählungstypen (Enumerations) Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 3/127

Grenzen der bisherigen Konzepte Im vorgherigen Teil haben wir grundlegende Datenstrukturen kennengelernt, die es uns ermöglicht haben, Mengen von Objekten zu verarbeiten. Arrays und Tupel waren jeweils Elemente von Kreuzprodukten über dieselbe Grundmenge bzw. über beliebige Grundmengen. Speziell die Tupel erlauben die Definition von beliebig strukturierten Datentypen. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 4/127

Grenzen der bisherigen Konzepte Wie erwähnt sind diese beiden Strukturen in den meisten höheren Programmiersprachen auch vorhanden. Dennoch haben diese Konzepte einige entscheidenden Schwächen, die wir uns jetzt genauer an einem Beispiel anschauen (und die u.a. zur Entwicklung der oo Programmierung führten). Wir wollen dazu ein Rechteck im 2D Raum darstellen/verarbeiten (bspw. wollen wir das Rechteck verschieben oder berechnen, ob ein Punkt in diesem Rechteck liegt, etc.). Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 5/127

Grenzen der bisherigen Konzepte Ein Rechteck kann durch vier Zahlen xlow, xup, ylow und yup vom Typ double repräsentiert werden: yup ylow xlow xup Die Zahlen definieren den unteren linken und den oberen rechten Eckpunkt. Alternativ lässt sich das Rechteck natürlich auch mit anderen vier Zahlen darstellen, z.b. xlow, ylow (linker unterer Eckpunkt) und xup xlow, yup ylow (Ausdehnungen in x bzw. y Richtung). Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 6/127

Grenzen der bisherigen Konzepte Aus diesen Überlegungen kann man sehr einfach einen Record-Datentyp für Rechtecke definieren. Wir wollen den Datentyp in einer eigenen Datei definieren und der Welt zur Benutzung zur Verfügung stellen: public class Rechteck { public double xlow; public double xup; public double ylow; public double yup; } Dazu könnten wir noch ein paar statische Methoden definieren müssen wir aber nicht, wir können auch so Variablen vereinbaren und mit diesem Datentyp arbeiten. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 7/127

Grenzen der bisherigen Konzepte Problem? Alle Programmierer, die den Datentyp Rechteck verwenden wollen, müssen die innere Struktur dieses Datentyps kennen und verstehen (insbesondere. welche Instanzvariablen was bedeuten, um sie korrekt zu verwenden, d.h. zu verändern bzw. abzurufen). Wenn Sie ein paar Wochen nicht damit gearbeitet haben, werden Sie sich auch nicht mehr genau daran erinnern. Gut ist hier vielleicht nicht so schwer aber im Prinzip: Wiederverwendbarkeit gleich null, dann kann ich den Datentyp gleich selbst (nochmal) programmieren... Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 8/127

Grenzen der bisherigen Konzepte Um z.b. eine (statische) Methode punktinrechteck zu implementieren, die prüft ob ein Punkt, gegeben durch zwei Koordinaten vom Typ double, in einem Rechteck enthalten ist, müssen wir die Details der Klasse Rechteck verstehen: public static boolean punktinrechteck (double x, double y, Rechteck r) { return ( (r.xlow <= x && x <= r.xup) && (r.ylow <= y && y <= r.yup)); } Hätten wir einen alternativen Modellierungsansatz für Rechtecke gewählt, wäre diese Methode falsch! Falls die Details nicht dokumentiert sind, bleibt uns nichts anderes übrig, als den Quell-Code zu lesen... Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 9/127

Abstrakte Datentypen Es wäre natürlich schön, wenn wir die Komplexität des Aufbaus einzelnen Datentypen vor dem Nutzer im Sinne eines abstrakten Datentyps verbergen könnten. Dieses Prinzip nennt man information hiding oder im Deutschen auch Kapseln und ist eines der zentralen Ideen des oo Paradigmas. Es fördert die Wiederverwendbarkeit von Programmteilen, ohne deren Details genau verstehen zu müssen. Wir nähern uns dieser neuen Art der Klassen, indem wir uns die historische Entwicklung vom einfachen Record-Datentyp zur Klasse in den unterschiedlichen Programmiersprachen am Beispiel des Objekts Rechteck anschauen. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 10/127

Vom primitiven Typ zur Klasse Wie wir bereits diskutiert haben, kann ein Rechteck durch vier double-werte, bzw. Variablen beschrieben werden: double xlow; double xup; double ylow; double yup; Bevor es Record-Typen gab, mussten diese Werte durch einzelne Variablen verwaltet werden ohne den semantischen Zusammenhang explizit darzustellen (Sie erinnern sich an unseren aller ersten Kalender...). Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 11/127

Vom primitiven Typ zur Klasse: Tupel/Structures Eine der ersten Programmiersprachen, die Record-Typen erlaubte, war Nikolaus Wirths Pascal. Er führte für die Sprache die Möglichkeit ein, zusammengesetzte Datentypen zu vereinbaren. Diese Typen sind entsprechend aus Komponentenvariablen aufgebaut, die allerdings auf primitive Typen eingeschränkt sind (diese Einschränkung besteht in Java nicht, wir haben bereits Arrays über Strings kennengelernt und es gibt keinen Grund, nicht auch für Instanzvariablen von Records Referenztypen zuzulassen). Nikolaus Wirth nannte diesen zusammengesetzten Typ Record, eine englische Bezeichnung für Tupel (macht Sinn). Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 12/127

Vom primitiven Typ zur Klasse: Tupel/Structures Kernighan und Ritchie wollten den Begriff Record für die Sprache C nicht übernehmen, wohl aber den zusammengesetzten Datentyp, den sie Struktur (engl. Structure, Schlüsselwort struct) nannten. Ein neuer (zusammengesetzter) Datentyp Rechteck kann in C wie folgt vereinbart werden: struct Rechteck { double xlow; double xup; double ylow; double yup; } Dieser Typ enthält die Komponenten xlow, xup, ylow und yup, jeweils vom Typ double. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 13/127

Vom primitiven Typ zur Klasse: Tupel/Structures Der neue Typ Rechteck kann in C nun als Typ für Variablen verwendet werden: struct Rechteck r; r ist eine Struktur-(/Record-)Variable mit den vier Komponenten xlow, xup, ylow und yup, deren Referenzierung wie in Java über die Punktnotation (die zum Standard in vielen Sprachen wurde) erfolgt. Eine Festlegung der Werte der Komponenten kann ebenfalls wie in Java durch Zuweisungen erfolgen: r.xlow = 1.0; r.xup = 7.0; r.ylow = 1.0; r.yup = 3.0; Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 14/127

Vom primitiven Typ zur Klasse: Tupel/Structures Natürlich kann man Variablen vom Typ struct Rechteck mit Funktionen bearbeiten. Diese Funktionen spezifizieren gewissermaßen das Verhalten dieses Typs. In C (wie in Pascal) und auch bisher bei uns werden diese Funktionen allerdings außerhalb der Struktur definiert, als statische Operationen, die man zusammen natürlich in ein gemeinsames Modul packen kann. Einzige Neuerung in Java bisher: wir dürfen auch Instanzvariablen verwenden, die nicht einen primitiven Typ sondern einen Referenz-Typ (also z.b. einen anderen Record-Typ) haben. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 15/127

Vom primitiven Typ zur Klasse: Tupel/Structures Die altbekannte Funktion in C: int punkt_in_rechteck(struct Rechteck r, double xcoord, double ycoord) { return ( (r.xlow <= xcoord && xcoord <= r.xup) && (r.ylow <= ycoord && ycoord <= r.yup)); } (Sie sehen nebenbei, dass die grundsätzliche Syntax von C (und C++) der von Java sehr ähnelt, allerdings gibt es keinen Typ boolean (Pfui), logische Ausdrücke haben stattdessen den Typ int (PFUI!!!)) Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 16/127

Vom primitiven Typ zur Klasse: Tupel/Structures Neben der ganzen Sauerei mit dem fehlenden Typ boolean ist aber eines ganz wichtig: Da diese Funktion außerhalb der Struktur (als Pendant zur statischen Methode in Java) definiert werden muss, kann sie natürlich nicht wissen, auf welchem Rechteck sie arbeitet. Das zu bearbeitende Rechteck muss in der Parameterliste übergeben werden (naja, so kennen wir das ja auch?!?!). Die Problematik ist natürlich auch hier, dass wir, um diese Methode zu schreiben, die Details der Struktur kennen und verstehen müssen. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 17/127

Vom primitiven Typ zur Klasse: Tupel/Structures Nehmen wir zunächst an, dass dies nicht extrem störend ist, d.h. auch folgende Funktion (Zugriff auf die Komponente xlow) ist für uns natürlich einfach: double get_xlow(struct Rechteck r) { return r.xlow; } Der Sinn dieser Funktion soll zunächst nicht diskutiert werden. Es ist aber sofort zu sehen, dass die Ausdrücke r.xlow und get_xlow(r) den selben Wert liefern. Offenbar wäre es konsequent, nicht nur die Eigenschaften (Komponenten) der Elemente (Objekte) eines Strukturtyps innerhalb der Struktur zu vereinbaren, sondern auch deren Verhalten (Operationen). Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 18/127

Vom primitiven Typ zur Klasse: Tupel/Structures Diesen Fortschritt brachte C mit Klassen (später C++ genannt). Eine Struktur durfte nun nicht nur Komponenten (Daten) enthalten, sondern auch Operationen. struct Rechteck { double xlow; double xup; double ylow; double yup; double get_xlow() { return xlow; } double get_xup() { return xup; } double get_ylow() { return ylow; } double get_yup() { return yup; } } int punkt_in_rechteck(double xcoord, double ycoord) {... } Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 19/127

Vom primitiven Typ zur Klasse: Tupel/Structures Die Funktionen der Struktur (z.b. get_xlow) haben nun keinen Übergabeparameter vom Typ struct Rechteck mehr (Ähnliches gilt für punkt_in_rechteck, auch hier wird kein Rechteck mehr übergeben). Die Methoden sind nämlich nun innerhalb der Struktur definiert (das ist neu und typisch für die oo-programmierung) und haben damit automatisch Zugriff auf die Komponenten. Und fast noch wichtiger: sie sind nun Teil der Eigenschaften der konkreten Objekte (Literale). Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 20/127

Vom primitiven Typ zur Klasse: Tupel/Structures Eine Variable r vom Typ struct Rechteck kann wie gewohnt vereinbart werden: struct Rechteck r; In C++ repräsentiert diese Variablen r nun ein Objekt. Dieses Objekt hat als Komponenten: die Komponentenvariablen (auch Instanzvarialen, Objektvariablen, also die Daten bzw. die Werte, die den Zustand des gesamten Objekts ausmachen): xlow, xup, ylow und yup. die Funktionen (auch (Objekt-) Methoden, also die Funktionalitäten, die das Verhalten des gesamten Objekts spezifizieren): get_xlow, get_xup, get_ylow, get_yup und punkt_in_rechteck. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 21/127

Vom primitiven Typ zur Klasse: Tupel/Structures Mit Objekt-Funktionen ist der Schritt zum abstrakten Datentyp nicht weit: Wenn wir die Objekt-Variablen und die Objekt-Funktionen so definieren, dass die Funktionen die einzige Möglichkeit bilden, auf die Objektvariablen zuzugreifen bzw. sie zu verändern, haben wir unser Ziel erreicht: Wir müssen dann nicht mehr die Struktur der Objekte verstehen, um ihren Zustand abzulesen bzw. zu verändern Wir müssen nur wissen, wie wir die Funktionen(Methoden) anwenden (aufrufen) müssen. Die Funktionen/Methoden bilden damit eine Abstraktionsebene, indem sie eine Schnittstelle für die Verwendung der Objekte darstellen. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 22/127

Vom primitiven Typ zur Klasse: Tupel/Structures Das ist übrigens im Prinzip sehr ähnlich zu den primitiven Typen 1. Es interessiert uns nicht, wie der Computer die Werte des Typs int darstellt. Es interessiert uns auch nicht, wie Grundoperationen (z.b. die Addition) implementiert sind. Die Grundoperationen funktionieren (hoffentlich) und wir wissen, wie wir sie verwenden können und was sie bewirken, das ist das einzige was zählt. 1 Allerdings wirklich nur vom Prinzip, also Vorsicht! Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 23/127

Vom primitiven Typ zur Klasse: Klassen Schreibt man statt struct nun class ist man bei den Klassen angekommen. Der Unterschied zwischen Klassen und Strukturen in C++ soll hier nicht diskutiert werden (er besteht i.w. in unterschiedlichen Default-Sichtbarkeiten der versch. Komponenten von außen). Java kennt nur das Sprachkonstrukt der Klasse. Bemerkung: Der Hauptunterschied zwischen Klassen in C++ und Java besteht bei der Bildung von Variablen (wird hier aber nicht diskutiert). Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 24/127

Vom primitiven Typ zur Klasse: Klassen Die Vereinbarung einer Klasse class Rechteck { double xlow; double xup; double ylow; double yup; } double getxlow() { return xlow; }... // weitere Objekt-Methoden macht den Datentyp Rechteck wie bisher dem Compiler bekannt. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 25/127

Klassen Was wir im Prinzip schon wissen: Eine Klasse bildet ein Objekt der realen Welt in ein Schema (definiert durch die Instanzvariablen) ab, das der Compiler versteht (d.h. macht einen neuen Datentyp bekannt). Objekte haben genau die Eigenschaften, die im Schema der Klasse definiert sind, sie sind Instanzen der Klasse (die Literale des neuen Typs). Neu ist: Objekte haben nun auch Methoden, die ihr Verhalten spezifizieren und die Objekte benutzbar machen. In Java gibt es eine große Anzahl vordefinierter Datentypen, die in der Java API als Bibliotheksklassen zur Verfügung gestellt werden. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 26/127

Klassen Eine Klassendefinition kann also mehr als ein simpler Record-Typ sein: Die Datentypen können nun aus Datenkomponenten (Instanzvariablen) und Funktions-Komponenten (instanz-methoden) bestehen. Die Datenkomponenten sind eine Art Blaupause und beschreiben die Struktur der Objekte ( Literale ) dieses Typs. Die Funktions-Komponenten spezifizieren das Verhalten von Objekten. Jedes Objekt der Klasse besitzt diese Struktur (alle Objektvariablen) und das Verhalten (alle Objektmethoden). Was wir noch nicht gemacht haben: die Objektvariablen sauber zu kapseln, aber das kommt bald. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 27/127

Statische und nicht-statische Elemente In der Klassendefinition Rechteck ist Ihnen vielleicht aufgefallen, dass nun das Schlüsselwort static bei den Variablen und insbesondere den Methoden komplett fehlt. Das macht auch nochmal den Unterschied zu unseren ursprünglichen rein imperativen Konzepten deutlich. Klassen sind in Java hauptsächlich dazu da, neue (eigene) Datentypen zu vereinbaren, deren Eigenschaften durch die Objektvariablen und Objektmethoden definiert werden. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 28/127

Statische und nicht-statische Elemente Diese Objekt-Komponenten sind Eigenschaften konkreter Objekte der Klasse und machen damit auch nur im Kontext eines konkreten Objekts Sinn. Sie können auch nur für konkrete Instanzen der Klasse aufgerufen werden (mit Punktnotation). Die statischen Elemente einer Klassendefinition sind dagegen (i.ü. ganz im Sinne unseres Modulkonzepts) nicht an die Existenz eines konkreten Objekts gebunden, sondern unabhängig von der Existenz einzelner Instanzen immer verfügbar. Sie werden daher nicht für konkrete Instanzen der Klasse, sondern für die Klasse selbst aufgerufen. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 29/127

Statische und nicht-statische Elemente Dieser Unterschied zeigt sich auch in der Namensgebung der unterschiedlichen Elemente. Eine statische Methode statischemethode(...) der Klasse K hat den (abgesehen vom Packagenamen vollständigen) Namen K.statischeMethode(...), mit dem sie aufgerufen werden kann. Eine Objektmethode objektmethode(...) dieser Klasse macht nur für ein konkretes Objekt Sinn, d.h. dazu muss es zunächst eine (lokale) Variable v vom Typ Klasse geben, die ein konkretes Objekt repräsentiert; die Methode kann dann mit der Punktnotation aufgerufen werden: v.objektmethode(...). Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 1. Klassen 30/127

Kapitel 2: Das objektorientierte Paradigma i 1. Klassen 2. Das objektorientierte Paradigma 3. Klassen und Objekte in Java 4. Aufzählungstypen (Enumerations) Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 31/127

Klassen, Klassen, Klassen Die erste bedeutende Errungenschaft der oo Programmierung ist also die Möglichkeit, eigene Datentypen durch Klassen zu spezifizieren. Dies ist mit einigen weiteren Aspekten und Feinheiten verbunden, von denen wir nachfolgend einige diskutieren wollen. Neben der neuen Möglichkeit zur Datendarstellung bzw. Modellierung von Daten zu deren Verarbeitung gilt: Die eigentliche Verarbeitung geschieht in den (Klassen- und Objekt-)Methoden: hier werden die eigentlichen Algorithmen implementiert, bei Java mit Hilfe des imperativen Paradigmas. Aus dieser Sicht ist oo also v.a. ein Modellierungs-Paradigma. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 32/127

Objekte, Objekte, Objekte Die zweite bedeutende Errungenschaft der oo Programmierung ist, dass man das Programmieren nun auf ein neues Abstraktions-Level hievt. Statt komplexe Algorithmen zu schreiben, die einzelne Teilaufgaben ggfs. in Funktionen/Prozeduren erledigen (die aufgerufen werden), besteht ein oo Programm v.a. aus Objekten (unterschiedlicher Klassen), die miteinander kommunizieren. Dies geschieht hauptsächlich über gegenseitige Methodenaufrufe. Vereinfacht: die Kunst ist nur noch, die richtigen Methoden in der richtigen Reihenfolge aufzurufen, anstatt die richtigen Anweisungen. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 33/127

Objekte, Objekte, Objekte Vorsicht: das suggeriert, dass ich nur noch Knöpfe richtig zusammenstecken/drücken muss, ohne zu wissen, wie die Knöpfe genau funktionieren (nur was sie tun). Das ist zwar richtig, dazu gehört aber leider auch die Fähigkeit, einzelne Knöpfe (Methoden) selbst zu programmieren (dazu brauchen wir funktionales und imperatives Programmieren). Und dazu gehört aber auch, zu verarbeitende Daten als Objekte zu abstrahieren und in Klassen zu strukturieren/modellieren. Im Folgenden, diese zwei Aspekte (oo Modellierung und oo Programmierung) im Detail... Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 34/127

Klassen als Mittel der Abstraktion Klassen bieten eine weitere Möglichkeit der Abstraktion, da es dem Programmierer nun möglich ist, ähnliche Objekte (mit ähnlichen Eigenschaften) zusammen zu fassen. Statt für alle möglichen Objekte gewisse Eigenschaften (insbes. Methoden) zu programmieren, werden die Unterschiede wegabstrahiert und die Methode einmal zur Verfügung gestellt (implementiert). Das spart nicht nur Arbeit sondern auch potentielle Fehlerquellen wie z.b. copy-paste von vermeintlich redundantem Programmcode. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 35/127

Klassen als Mittel der Abstraktion Ein anschauliches Beispiel: Sie lernen einmal wie ein Auto zu fahren ist und können dann alle möglichen Autos (untersch. Hersteller etc.) fahren. Warum? Die Bedienung abstrahiert von den speziellen (für das Fahren irrelevanten) Eigenschaften der unterschiedlichen Fabrikate. Sie müssen z.b. nur wissen, wie man das Lenkrad dreht, um zu lenken (wie diese Lenk-Bewegung tatsächlich auf die Straße gebracht wird, müssen Sie nicht wissen). Analoges gilt fürs Gasgeben, Bremsen, Blinken, etc. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 36/127

Klassen als Mittel der Abstraktion Noch ein Beispiel: Lichtschalter in einem Haus Alle Lichtschalter sind gleich zu bedienen. Alle Lichtschalter sind gleich konstruiert. Dennoch unterscheidet sich der Lichtschalter für die Flurbeleuchtung vom Lichtschalter fürs Badezimmer: Es ist nicht derselbe Lichtschalter. Statt jeden einzelnen Lichtschalter neu zu modellieren/programmieren, abstrahiert man eine Klasse Lichtschalter, der alle Funktionalitäten nur einmal (für alle möglichen Lichtschalter) implementiert. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 37/127

Klassen als Mittel der Abstraktion In unserem konkreten Beispiel der Klasse Rechteck: Sie können z.b. testen, ob ein Punkt in einem beliebigen Rechteck ist, ohne andere (für diesen Test irrelevante) Besonderheiten unterschiedlicher Rechtecke (wie z.b. der Flächeninhalt, die Farbe des Rechtecks (wenn es überhaupt eine hat)) zu kennen. D.h. Sie müssen nicht alle Details eines Rechtecks kennen, nur die für die Aufgabe wesentlichen. Fazit: Abstraktion hilft, Details zu ignorieren, und reduziert damit die Komplexität des Problems; dadurch werden komplexe Apparate und Techniken beherrschbar. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 38/127

Klassen als Mittel der Datenkapselung Eine weitere wichtige Errungenschaft von Klassen ist die Möglichkeit, die innere Struktur der Objekte einer Klasse (also die Daten-Komponenten/Instanzvariablen) vor dem Benutzer/Programmierer zu verstecken. Wie erwähnt spricht man hier von Datenkapselung (engl. information hiding). Konkret geschieht das in Java mit dem schon kurz angesprochenen Sichtbarkeitsattribut private für nur innerhalb dieser Klasse sichtbar. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 39/127

Klassen als Mittel der Datenkapselung Unsere Klasse Rechteck nun sauber gekapselt: class Rechteck { private double xlow; private double xup; private double ylow; private double yup; } public double getxlow() { return xlow; }... // weitere Objekt-Methoden // typischweise als public deklariert Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 40/127

Klassen als Mittel der Datenkapselung Die Instanz-Variablen repräsentieren den Zustand der Objekte, sind sie nun als private deklariert, sind sie außerhalb der Klassendefinition nicht mehr sichtbar!!! Die Methoden sind nur einmal realisiert / definiert und operieren bei jedem Aufruf auf den Daten eines bestimmten konkreten Objekts (sie repräsentieren das Verhalten der Objekte). Die nicht als private deklarierten Methoden bilden die öffentliche Schnittstelle der Klasse. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 41/127

Klassen als Mittel der Datenkapselung Kapselung bedeutet, dass (von gewollten Ausnahmen abgesehen) die nicht als private deklarierten Methoden die einzige Möglichkeit darstellen, mit einem konkreten Objekt zu kommunizieren und so Informationen über dessen Zustand (die aktuellen Werte der Instanz-Variablen) zu gewinnen oder diesen zu verändern. Meist sind diese Methoden als public deklariert. Fehlt die Sichtbarkeit, sind sie wie erwähnt zumindest im eigenen Package von außerhalb der Klasse sicht- und aufrufbar (package-scoped). Darüberhinaus gibt es noch die Sichtbarkeit protected, die wir auch sehr bald kennen lernen werden. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 42/127

Klassen als Mittel der Datenkapselung Die Sichtbarkeitsattribute sind entscheidend für die Umsetzung der Kapselung. Kapselung hilft, die Komplexität der Bedienung eines Objekts zu reduzieren. Durch Kapselung werden die Implementierungsdetails von Objekten verborgen. Dadurch können Daten nicht bewusst oder versehentlich verändert werden. Kapselung ist daher auch ein wichtiger Sicherheitsaspekt: Ein direkter Zugriff auf die Daten wird unterbunden, der Zugriff erfolgt nur über definierte Schnittstellen, nämlich über die bereitgestellten Methoden. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 43/127

Klassen als Mittel der Datenkapselung Beispiel: Welche Attribute den Zustand eines Lichtschalters definieren kann uns egal sein, solange wir wissen, wie wir den Lichtschalter bedienen müssen. Tatsächlich können wir den Zustand eines Lichtschalters nur über dessen Schnittstelle verändern (indem wir den Schalter drücken oder drehen). Und das ist vermutlich gut so, andernfalls könnten wir möglicherweise einen Stromschlag bekommen... Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 44/127

Klassen als Mittel der Datenkapselung Nochmal die Klasse Rechteck: public class Rechteck { // Attribute: alle private private double xlow; private double xup; private double ylow; private double yup; } // Methoden: alle public public double getxlow() { return xlow; } public double getylow() { return ylow; } public double getxup() { return xup; } public double getyup() { return yup; } public void verschiebe(double xdir, double ydir) {... } Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 45/127

Klassen als Mittel der Datenkapselung Zugriff auf den Zustand eines Objekts erfolgt hier nur z.b. über die public Methode getxlow, die als private deklarierten Instanz-Variablen sind nach außen nicht sichtbar. Die Methode verschiebe(double xdir, double ydir) ist in dieser Implementierung die einzige Möglichkeit, um den Zustand eines konkreten Rechtecks zu ändern. Will man dies ändern, muss main weitere Methoden hinzufügen, z.b. public void setxlow(double newxlow) { xlow = newxlow; } All diese Methoden kann man benutzen ohne Implementierungsdetails zu kennen. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 46/127

Klassen als Mittel der Datenkapselung Wie erwähnt, wäre eine (gleichwertige) Alternative, das Rechteck durch vier Doubles zu modellieren, die nun den linken unteren Punkt und eine Ausdehnung in x- und eine Ausdehnung in y-richtung definieren. Die entsprechende Klasse RechteckAlternativ: public class RechteckAlternativ { private double xcoord; // x-koordinate des Punktes private double ycoord; // y-koordinate des Punktes private double xrange; // x-ausdehnung private double yrange; // y-ausdehnung... } Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 47/127

Klassen als Mittel der Datenkapselung Die Methode verschiebe ist hier vermtlich einfacher und (ein klitziklein wenig) effizienter zu implementieren (wir müssen nur zwei Werte ändern). An diesem Beispiel sieht man auch die Stärken der Kapselung: dem Benutzer der Methode verschiebe ist letztlich herzlich egal, wie die Klasse nun intern strukturiert ist. D.h. vielleicht hat der Programmierer der Klasse Rechteck sogar zunächst Variante 1 gewählt und später die effizientere Variante 2 gefunden. Er kann das problemlos ändern, solange die Signatur der Methoden (Schnittstelle) sich nicht ändert kriegen die Benutzer das garnicht mit. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 48/127

Klassen als Mittel der Datenkapselung Übrigens: auch der Typ String ist ein Beispiel für Daten-Kapselung. Die Implementierungsdetails von Zeichenketten (letztlich als char[] bleiben vor dem Benutzer verborgen. Schnittstelle dieser Klasse ist aber relativ speziell und ist für die allgemeine Veranschaulichung aller weiteren Aspekte der oo Programmierung nicht ganz perfekt geeignet. Durch saubere Datenkapselung sind Klassen die perfekte und konsequente Erweiterung der Idee der abstrakten Datentypen. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 49/127

Klassen unterstützen die Wiederverwendbarkeit Durch Abstraktion und Kapselung wird die Wiederverwendbarkeit von Programmteilen gefördert. Wiederverwendbarkeit hilft, effizienter und fehlerfreier zu programmieren. Beispiel: Sog. Collections sind Objekte, die Sammlungen anderer Objekte aufnehmen und verarbeiten können. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 50/127

Klassen unterstützen die Wiederverwendbarkeit Collections sind meist sehr kompliziert aufgebaut, haben dafür aber typischerweise eine einfache Art der Bedienung (Schnittstelle). Werden Collections als Klasse realisiert, werden durch die Kapselung die komplexen Details des Aufbaus wegabstrahiert. Dies erleichtert die Wiederverwendung: Wenn ein Programm eine spezielle Collection benötigt, muss ein Objekt der passenden Klasse erzeugt werden, auf das das Programm über die einfache Schnittstelle (Methoden der Klasse) zugreifen kann. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 51/127

Beziehungen zwischen Klassen Betrachten wir noch einmal unsere Klasse mit einer weiteren Methode, die prüft, ob ein Punkt innerhalb des Rechtecks liegt: public class Rechteck { private double xlow; private double xup; private double ylow; private double yup;... public boolean pointinside(double xcoord, double ycoord) {... } } Ist das Argument der Methode pointinside nicht ein Objekt Punkt, bestehend aus zwei Koordinaten (xcoord, ycoord)? Das Rechteck selbst wird ebenfalls von zwei solchen Punkten (xlow, ylow) und (xup, yup) aufgespannt. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 52/127

Beziehungen zwischen Klassen Das riecht nach einer Klasse Punkt! Und hier ist sie: public class Punkt { private double x; private double y; } public double getx() { return x; } public double gety() { return y; } Damit können wir auch Rechteck neu definieren public class Rechteck { private Punkt lowleft; private Punkt upright; } public boolean pointinside(punkt p) {... }... Klassen (Objekte) existieren i.d.r. nicht isoliert, sondern stehen in Beziehung zueinander. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 53/127

Beziehungen zwischen Klassen Grundsätzlich gibt es in der oo Programmierung drei Arten von Beziehungen: Generalisierung und Spezialisierung ( is-a -Beziehungen) Beispiel: ein Quadrat und ein Rechteck (Spezialisierungen) sind Vierecke (Generalisierung). Aggregation und Komposition ( part-of -Beziehungen) Beschreibt die Zusammensetzung eines Objekts aus anderen Objekten (Aggregation: nicht essentiell, Komposition: essentiell). Beispiel: ein Punkt ist Teil eines Rechtecks (Komposition, das Rechteck existiert sonst nicht) Verwendungs- und Aufrufbeziehungen (typw. in Methoden) Beispiel: ein Rechteck verwendet in unserem Beispiel einen Punkt als Eingabeparameter in einer Methode. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 54/127

Vererbung Eine is-a -Beziehung zwischen zwei Klassen A und B sagt aus, dass B alle Eigenschaften von A besitzt (und darüberhinaus typischerweise noch ein paar mehr B ist ja eine Spezialisierung von A). is-a -Beziehungen werden in der oo Programmierung durch Vererbung modelliert. Die speziellere Klasse wird dabei nicht komplett neu definiert, sondern von der allgemeineren Klasse abgeleitet. Die speziellere Klasse erbt implizit alle Eigenschaften der allgemeineren Klasse (auch: Vaterklasse oder Oberklasse) ohne, das sie nochmal explizit aufgeführt werden müssen. Eigene Eigenschaften können nach Belieben hinzugefügt werden. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 55/127

Vererbung Vererbungen können mehrstufig sein, d.h. eine abgeleitete Klasse kann wiederum Vaterklasse für andere abgeleitete Klassen sein (dies führt ggfs. zu einer Vererbungshierarchie). Grundsätzlich kann eine Klasse auch von mehreren Vaterklassen abgeleitet sein (z.b. ist ein Amphibienfahrzeug eine Spezialisierung sowohl eines Wasserfahrzeug als auch eines Landfahrzeug). In diesem Fall spricht man von Mehrfachvererbung. Prof. Dr. Peer Kröger: EiP (WS 18/19) Teil 6: Grundlagen der oo Programmierung 2. Das objektorientierte Paradigma 56/127