Objektorientierte Programmierung



Ähnliche Dokumente
Einführung in die Programmierung

Objektorientierte Programmierung. Kapitel 12: Interfaces

Einführung in die Java- Programmierung

Programmieren in Java

5.5.8 Öffentliche und private Eigenschaften

Computeranwendung und Programmierung (CuP)

Vorkurs C++ Programmierung

SEP 114. Design by Contract

Programmierkurs Java

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Java: Vererbung. Teil 3: super()

Objektorientierte Programmierung

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Client-Server-Beziehungen

Große Übung Praktische Informatik 1

Java Kurs für Anfänger Einheit 5 Methoden

BEISPIELKLAUSUR Softwareentwicklung:

Monitore. Klicken bearbeiten

Modellierung und Programmierung 1

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Scala kann auch faul sein

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Einführung in die Programmierung

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Klassenbeziehungen & Vererbung

Design by Contract with JML

Typumwandlungen bei Referenztypen

1 Vom Problem zum Programm

5. Tutorium zu Programmieren

Tagesprogramm

Programmierkurs Java

2. Semester, 2. Prüfung, Lösung

Software Engineering Interaktionsdiagramme

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Einführung in die Java- Programmierung

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Software Engineering Klassendiagramme Assoziationen

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

13 OOP MIT DELPHI. Records und Klassen Ein Vergleich

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Studentische Lösung zum Übungsblatt Nr. 7

Zählen von Objekten einer bestimmten Klasse

Einführung in die Programmierung für Wirtschaftsinformatik

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Software Engineering Klassendiagramme Einführung

Vererbung & Schnittstellen in C#

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Ein Blick voraus. des Autors von C++: Bjarne Stroustrup Conrad Kobsch

Algorithmen und Datenstrukturen

Java Einführung Umsetzung von Beziehungen zwischen Klassen. Kapitel 7

Webalizer HOWTO. Stand:

Erwin Grüner

Probeklausur: Programmierung WS04/05

Javakurs 2013 Objektorientierung

EndTermTest PROGALGO WS1516 A

SEQUENZDIAGRAMM. Christoph Süsens

Grundlagen von Python

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Deklarationen in C. Prof. Dr. Margarita Esponda

Objektorientierte Programmierung OOP

Handbuch ECDL 2003 Professional Modul 3: Kommunikation Kalender freigeben und andere Kalender aufrufen

Softwaretechnik (Allgemeine Informatik) Überblick

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Arrays Fortgeschrittene Verwendung

Klassendefinitionen verstehen

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie

Übungen Programmieren 1 Felix Rohrer. Übungen

Java Einführung Methoden in Klassen

Client-Server Beziehungen

Programmieren Tutorium

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Der lokale und verteilte Fall

Zwischenablage (Bilder, Texte,...)

Objektorientierung: Klassen und Objekte

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

Innere Klassen in Java

Daniel Warneke Ein Vortrag im Rahmen des Proseminars Software Pioneers

U08 Entwurfsmuster (II)

2A Basistechniken: Weitere Aufgaben

3 Objektorientierte Konzepte in Java

5. Abstrakte Klassen

Statuten in leichter Sprache

Programmieren für Ingenieure Sommer Ein Rechner. Rechner sind überall. Gerät, das mittels programmierbarer Rechenvorschriften Daten verarbeitet.

C++ Tutorial: Timer 1

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Professionelle Seminare im Bereich MS-Office

Diana Lange. Generative Gestaltung Operatoren

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Transkript:

Objektorientierte Programmierung 1

Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum Erweiterungen einer gegebenen Basissprache) Java (C++ ohne Hacks?) 2

Beispiel aus vorigem Kapitel Lineare Suche in Arrays: public static boolean enthaelt(int[] array, int fuellstand, int elem) { int i; for (i = 0; i <= fuellstand; i++) { if (array[i] == elem) { return true; return false; 3

Problem 1 Array und Füllstand müssen für jede Funktion separat als Parameter übergeben werden. Lästig, insbesondere falls mehrere Mengen in einem Programm benutzt werden (Verwechselungsgefahr). Lösung: zusammengehörige Variable zusammenfassen (record, struct). z.b. in C: struct Menge { /* KEIN JAVA! */ int array[1000]; int fuellstand; 4

Problem 2 Beispiel: Ein Programm benutzt unsortierte Arrays, um Mengen zu implementieren. Es liefert korrekte Ergebnisse (wenn auch zu langsam). Einer der Programmierer entschließt sich, unsortierte Arrays durch sortierte Arrays zu ersetzen. Er tauscht darum die Funktionsrümpfe der Funktionen enthaelt und fuegeein aus. Daraufhin liefert das Programm falsche Ergebnisse. Warum? 5

Problem 2 Beispiel: Ein Programm benutzt unsortierte Arrays, um Mengen zu implementieren. Es liefert korrekte Ergebnisse (wenn auch zu langsam). Einer der Programmierer entschließt sich, unsortierte Arrays durch sortierte Arrays zu ersetzen. Er tauscht darum die Funktionsrümpfe der Funktionen enthaelt und fuegeein aus. Daraufhin liefert das Programm falsche Ergebnisse. Warum? 6

Problem 2 Beispiel: Ein Programm benutzt unsortierte Arrays, um Mengen zu implementieren. Es liefert korrekte Ergebnisse (wenn auch zu langsam). Einer der Programmierer entschließt sich, unsortierte Arrays durch sortierte Arrays zu ersetzen. Er tauscht darum die Funktionsrümpfe der Funktionen enthaelt und fuegeein aus. Daraufhin liefert das Programm falsche Ergebnisse. Warum? 7

Problem 2 Analyse des Programms zeigt: Im Programm treten unsortierte Arrays auf. Die neue Funktion enthaelt liefert dann falsche Ergebnisse. Des Rätsels Lösung: Einer anderer Programmierer hatte nicht die Funktion fuegeein aufgerufen, sondern von Hand die Variable fuellstand erhöht und den neuen Wert am Ende des Arrays eingetragen. Dieser Programmteil wurde nicht geändert. 8

Problem 2 Analyse des Programms zeigt: Im Programm treten unsortierte Arrays auf. Die neue Funktion enthaelt liefert dann falsche Ergebnisse. Des Rätsels Lösung: Einer anderer Programmierer hatte nicht die Funktion fuegeein aufgerufen, sondern von Hand die Variable fuellstand erhöht und den neuen Wert am Ende des Arrays eingetragen. Dieser Programmteil wurde nicht geändert. 9

Problem 2 Wenn eine Komponente A auf Implementierungsdetails einer anderen Komponente B zugreifen kann, dann kann die Implementierung von B nicht ohne weiteres ausgewechselt werden. 10

Lösung Forderung: Trennung von Schnittstelle (was?) und Implementierung (wie?). Kapselung der Implementierung: Der Rest des Programms darf nur über die Schnittstelle auf die Implementierung zugreifen. Benutzer (und Implementierer) einer Komponente bekommen die wesentlichen Informationen: Schnittstelle/Verhalten/Kontrakt (und nicht mehr). 11

Kapselung Weitere Gründe: Zugriff auf interne Variable erhöht generell Gefahr von Fehlern. Überschaubarkeit. Bei größeren Software-Projekten: Entwurf: (wiederholte) Zerlegung in Komponenten. Implementierung: verschiedene Komponenten parallel! Integration: Zusammenbau der Komponenten. 12

Idee Zusammenfassen: Zusammengehörige Variable (wie bei record/struct), Operationen, mit denen diese Variable manipuliert werden dürfen. Zusätzlich: Unterscheidung zwischen öffentlichen und privaten Variablen und Operationen 13

Objekte und Klassen Objekt = Zustand (Variable) + Verhalten (Operationen, Methoden ) Jedes Objekt ist Exemplar (Instanz) einer Klasse. Klassen definieren das Verhalten ihrer Exemplare. 14

Objekte und Klassen public class Menge { int[] array; int fuellstand; // Variable... // Konstruktoren public boolean enthaelt(...) {... public void fuegeein(...) {... // Methoden 15

Objekte und Klassen Syntax: Methoden sind Bestandteile des Objekts und werden auch so angesprochen (analog zu Recordkomponenten). Menge mg; int n;... n = mg.fuellstand; mg.fuegeein(0); // statt: fuegeein(mg, 0) Vergleiche: String s1, s2; TextField tf;... s1 = tf.gettext(); s2 = s1.substring(0,1); 16

Objekte und Klassen Nomenklatur: Ein anderes Objekt schickt dem Objekt mg eine Nachricht fuegeein(0). mg führt daraufhin eine Methode aus. (Die Verantwortung für das Interpretieren der Nachricht liegt beim Empfänger mg.) Berechnung = Kommunikation: gut geeignet für hochgradig interaktive Programme, gut geeignet für Simulationen der realen Wert, gut verträglich mit Parallelismus. 17

Objekte und Klassen public class Menge { // Variable int[] array; int fuellstand; // ohne public: nicht (bzw. nur // bedingt) von außen zugreifbar. // Konstruktoren (später)... 18

Objekte und Klassen // Methoden public boolean enthaelt(int elem) { int i; for (i = 0; i <= fuellstand; i++) { if (array[i] == elem) { return true; return false; 19

Objekte und Klassen public void fuegeein(int elem) { fuellstand++; array[fuellstand] = elem; 20

Objekte und Klassen Erzeugung von Objekten: Menge mg; mg = new Menge(); 21

Objekte und Klassen Konstruktoren sind optional: falls kein Konstruktor angegeben wird, werden die Variablen in Objekten mit 0, \000, false, null initialisiert. aber: das wäre hier ungünstig. fuellstand sollte zu Beginn den Wert -1 haben, array sollte mit einem Array initialisiert sein. 22

Objekte und Klassen public class Menge { int[] array; int fuellstand; // Variable Menge() { // Konstruktoren fuellstand = -1; // beachte: kein Typ, array = new int[1000]; // kein return, // Name = Klassenname // Methoden wie bisher... 23

Objekte und Klassen Konstruktoren können parameterisiert sein: Menge(int maxfuellstand) { fuellstand = -1; array = new int[maxfuellstand]; Aufruf: Menge mg; mg = new Menge(2000); 24

Noch ein Beispiel class Zaehler { public int n; Zaehler() { n = 1; public int wert() { return n; public void inkr() { n++; 25

Noch ein Beispiel Zaehler z; z = new Zaehler(); System.out.println(z.n); // -> 1 (*) System.out.println(z.wert()); // -> 1 z.inkr(); z.inkr(); System.out.println(z.wert()); // -> 3 z.n = 15; // (*) System.out.println(z.wert()); // -> 15 // (*) geht nur, falls n als public deklariert ist! // (was man gewöhnlich NICHT tut) 26

Noch ein Beispiel Auf Objekte wird nur über Referenzen zugegriffen: Gleichheitstest (z1 == z2): überprüft, ob z1 und z2 dasselbe Objekt bezeichnen. Zuweisung (z1 = z2): z1 bezeichnet nun dasselbe Objekt wie z2: Zaehler z1, z2; z1 = new Zaehler(); z2 = z1; System.out.println(z1.wert()); // -> 1 z2.inkr(); System.out.println(z1.wert()); // -> 2 27