• Keine Ergebnisse gefunden

Präsentation Objektorientierte Programmierung OOP

N/A
N/A
Protected

Academic year: 2022

Aktie "Präsentation Objektorientierte Programmierung OOP"

Copied!
21
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Modul 404

Kompetenz: Vorgabe interpretieren, objektbasiert mit einer Programmiersprache implementieren, dokumentieren und testen.

Objektbasiert programmieren nach Vorgabe

Ueli Hagger

Modul 404

Einführung Objektorientierte Programmierung OOP 1

(2)

• Herdt Bücher

• Programmierung Grundlagen – mit Beispielen in Java

• Kapitel 10: Seite 112 bis 129

• und

• Java 9 - Grundlagen Programmierung

• Kapitel 6: Seite 62 bis 78 und

• Kapitel 7: Seite 79 bis 88

Klassen und Objekte

Objekte (Kapitel 10.6, bzw. 6.3)

Ein Objekt auch Instanz genannt, ist ein Exemplar eines bestimmten Datentyps oder einer bestimmten Klasse.

Objekte sind konkrete Ausprägungen einer Klasse und werden während der Laufzeit erzeugt.

Marke: Porsche Model: 911 Carrera Preis: 128'000 PS: 370 Farbe: blau

Fahrgestellnr.: WP0 12368 ZulassungKanton: SG

Marke: Subaru

Model: 2.0i 4x4 LUXURY Preis: 35'500

PS: 156 Farbe: weiss

Fahrgestellnr.: 4S 152011 ZulassungKanton: ZH

Marke: Smart Model: fortwo cabrio Preis: 18'000 PS: 71 Farbe: gelb

Fahrgestellnr.: WME 884269 ZulassungKanton: AR 3

(3)

Klassen und Objekte

• Klassen (Kapitel 10.4 und 10.5, bzw. 6.1 und 6.2)

• Abstraktes Datenmodell für eine Reihe ähnlicher Objekte.

• Klasse: Auto

Marke Model Preis PS Farbe Fahrgestellnr.

ZulassungKanton ZulassungsNr

Klassen und Objekte

Aufbau einer Klasse in Java

// Deklaration der Klasse Name class Name

{

// Attribute

// Methoden

} // class Name

Aufbau einer Klasse in Java

// Deklaration der Klasse Auto class Auto

{

String model;

double preis;

int ps;

String farbe;

String fahrgestellnr;

String zulassungKanton;

int zulassungsNr;

public void methode() {

} // methode

5

(4)

Objekte (Instanzen) einer Klasse erzeugen

Klassenname objektname;

// Instanz zuweisen

objektname = new Klassenname();

oder direkt

Klassenname objektname = new Klassenname();

Ein Objekte (Instanzen) der Klasse Auto erzeugen

Auto fahrzeug1;

// Instanz zuweisen fahrzeug1 = new Auto();

oder direkt

Auto fahrzeug1 = new Auto();

Fragen

1. Was ist der Unterschied zwischen Klassen und Objekten?

2. Wie werden Objekte erzeugt?

3. Was verstehen sie unter Datenkapselung?

4. Was ist ein Konstruktor und wozu dient er?

5. Was ist eine setter- bzw. eine getter-Methode?

6. Für was verwendet man sie?

7. Wie sind sie grundsätzlich aufgebaut?

7

(5)

Klassen und Objekte

Wir wollen nun eine Klasse Bruch programmieren.

Als erstes müssen wir die Anforderungen an einen Bruch definieren.

Wir werden uns aber nur minimale Anforderungen verwenden.

Diese sind:

- Dezimale Ausgabe eines Bruches - Werte setzen (Nenner, Zaehler)

Selbstverständlich müssen wir vorab wissen bzw. uns informieren wie ein Bruch aufgebaut ist.

Klassen und Objekte

Aufbau einer Klasse Bruch in Java

// Deklaration der Klasse Bruch class Bruch

{

// Attribute int nenner;

int zaehler;

// Methoden } // class Auto 9

(6)

1. Erstellen sie ein neues Projekt mit dem Namen "bruchrechnen".

2. Erstellen sie nun eine Klasse

inkl. main-Methode mit dem Namen "Bruchrechnen".

3. Erstellen sie nun eine weitere Klasse mit dem Namen "Bruch".

4. Als nächstes deklarieren wir die benötigten Attribute 5. Danach kommen die Methoden

Übung: Bruch

Solange wir nicht mit dem grafischen Interface arbeiten brauchen wir immer eine Klasse mit der main-Methode.

In dieser wird der Programmablauf programmiert. Die weiteren Klassen sollten sie, wie oben verwendet, in einem separatem File speichern

11

(7)

Übung: Bruch

Nun programmieren wir die Klasse Bruch mit seinen Attributen und Methoden.

Attribute sollten immer mit privatedeklariert werden (Datenkapselung)

Dazu verwenden wird das Schlüsselwort private.

Um einen Bruch zu realisieren brauchen wir mindestens zwei Attribute. Diese

Benennen wir mit logischen problembezogenen Namen, z.B. nenner und zaehler.

Übungshalber machen wir den zaehler private(gekapselt) und den nenner public (public könnte auch weggelassen werden).

Übung: Bruch

Beachten sie die Meldungen, welche links mit einem Ausrufezeichen. Ein rotes X bedeutet, dass es eine syntaktischen Fehler hat, z.B. Strichpunkt vergessen..

Ein Ausrufezeichen ist ein logischer Fehler.

Klicken sie auf das Ausrufezeichen

13

(8)

Wenn wir nun die Meldung genauer anschauen, dann sehen sie das sogenannte getter und setter Methoden ausgewählt werden können.

setter-Methodendienen dazu Attribute zu verändern. (Kapitel 7.2)

getter-Methodenliefern den Wert eines Attributes zurück. (Kapitel 7.2)

Doppelklicken sie nun auf

"Create getter and setter…".

Belassen sie die vorgeschlagenen Namen und setzen sie den Hacken.

Übung: Bruch

• Jetzt sehen sie zwei Methoden im Code.

Beide sind public, d.h. nicht gekapselt.

• Beide Methoden müssen nicht mehr angepasst werden.

Analysieren sie die beiden Methoden

15

(9)

Übung: Bruch

• Nun wollen wir die Klasse anwenden. Dafür müssen wir ein Objekt erzeugen. Dies programmieren wir in der main-Methode.

• Beachten sie, wenn nach dem Objektnamen ein Punkt eingegeben wird kommt eine Auswahl von möglichen Attributen bzw.

Methoden, z.B. Attribut nenner, welches wir bewusst public gewählt haben und die

beiden Methoden getZaehler()und setZaehler()

Übung: Bruch

• Rechts sehen sie als erstes die Erzeugung eines neuen Objektes mit new.

• Danach werden die beiden Attribute initialisiert. Da nenner publicist, kann direkt darauf zugegriffen werden.

• Der zaehlermuss über die getter- bzw.

setter Methoden verwendet werden.

17

(10)

• Nachdem wir gesehen haben, dass Attribute auch public deklariert werden können, dies aber aufgrund der

Datenkapselungnur in Ausnahmefällen gemacht wird, ändern wir nenner auch auf privat.

• Die hat aber zur Folge, dass wir für den nenner auch eine getter- und setter-Methode programmieren müssen.

• Schauen sie sich nun die main-Methode an, insbesondere die Fehler.

Aufgaben Teil 2

• Schreiben sie eine Methode, welche den Dezimalwert des Bruches als Funktionswert zurückliefert

• Zum testen setzen sie zuerst nenner (5) und zaehler (1) mit den beiden Setter- Methoden. Danach rufen sie die neue Methode auf und geben das Ergebnis auf die Konsole aus, z.B.

• Vorstellung und Besprechung der Lösungen

19

(11)

Aufgaben

Schreiben sie ein Methode, welche den Dezimalwert des Bruches als Funktionswert zurückliefert

Zum testen setzen sie zuerst Nenner (5) und Zähler (1) mit den beiden Setter-Methoden.

Danach rufen sie die neue Methode auf und geben das Ergebnis auf die Konsole aus, z.B.

Konstruktor (Kapitel 10.8 bzw. 7.3)

Bei der Erzeugung eines Objektes mit dem new– Operator sollte es grundsätzlich in einem definierten Anfangszustand sein. Dabei wird ein Standardkonstruktor

abgearbeitet. Dieser muss nicht programmiert werden, kann aber.

Wie beim Bruch gesehen, ist ohne Initialisierung von nenner und zaehler mit den beiden setter- Methoden, deren Inhalt undefiniert.

Sollten die beiden Werte definiert sein, so könnte man eine zusätzliche Methode, z.B.

setze() programmieren.

Einfacher geht dies mit Konstruktoren, welche auch Methoden sind, jedoch den gleichen Namen wie die Klasse haben.

Konstruktoren haben keinen Funktionswert auch nicht void.

Es können mehrere verschiedene Konstruktoren in der gleiche Klasse sein. Dabei müssen sie sich aber in der Argumenten-Liste voneinander unterscheiden. Man nennt dies überladen von Methoden.

21

(12)

• Zurück zur Klasse Bruch.

• Was für Konstruktoren wären sinnvoll?

Bruch: Konstruktor (Kapitel 10.8 bzw. 7.3)

Zurück zur Klasse Bruch.

- Standardkonstruktor -> nenner 1, zaehler 0

- nenner und zaehler mit konkreten Werten initialisieren - nur zaehler initialialisieren. Dann muss der nenner 1 sein.

23

(13)

Bruch: Konstruktor (Kapitel 10.8 bzw. 7.3)

Der Standardkonstruktor hat folgenden Aufbau

Bruch() {

this.nenner = 1;

this.zaehler = 0;

} // Standardkonstruktor Bruch

Lassen sie das Programm laufen. Sie müssen nichts in der main-Methode ändern.

Bruch: Konstruktor (Kapitel 10.8 bzw. 7.3)

• Programmieren sie nun die beiden restlichen Konstruktoren und testen sie sie indem sie zwei weitere Objekte erzeugen.

• Die Konstruktoren haben beide den gleichen Namen (Klassenname) und unterscheiden sie durch die Übergabeparameter.

- nenner und zaehler mit konkreten Werten initialisieren - nur zaehler initialialisieren. Dann muss der nenner 1 sein.

25

(14)

• Programmieren sie nun die beiden restlichen Konstruktoren und testen sie sie indem sie zwei weitere Objekte erzeugen.

• Die Konstruktoren haben beide den gleichen Namen (Klassenname) und unterscheiden sie durch die Übergabeparameter.

Aufgaben Teil 2

• Lösen sie nun die Aufgaben 4 (Konstruktoren der Klasse Bruch)

• Vorstellung und Besprechung der Lösungen

27

(15)

GGT, z.B.

Quelle: https://www.informatikzentrale.de/aufgaben-30.10.2015.html

Debugger

Um Fehler in einem Programm zu suchen, bzw. den Programmablauf zu kontrollieren stellen die meisten IDE's einen integrierten Debugger zur Verfügung.

siehe auch im Internet, z.B.

https://jaxenter.de/debugging-eclipse-ide-java-59263

Quelle:

https://www.theregister.co.uk/2018/08/07/chaff_confuse_automated_vulnerability_scanners/

29

(16)

Um nun das Programm schrittweise abzuarbeiten, müssen wir mindestens einen Breakpoint (Haltepunkt) setzen. Dies geschieht in dem wir im Sourcecode auf die Zeilennummer doppelklicken oder mit der rechnen Maustaste "Toggle Breakpoint" wählen.

Nun sehen wir einen blaue Punkt vor der Zeilennummer.

Wenn wir nun "Debugger" drücken startet das Programm und hält beim Haltepunkt an. Dies sieht man auch im Code.

Beim blauen Punkt sehen wir zusätzlich noch einen blauen Pfeil und die Zeile wird grün.

Das Programm hat nun gestoppt die grüne Zeile jedoch noch nicht ausgeführt.

Beachten sie das Fenster "Variables". Darin sehen sie alle Variablen bzw. Objekte mit dem Inhalt.

Debugger

Das Programm hat nun gestoppt. Beachten sie nun

das Fenster "Variables".

Darin sehen sie alle Variablen bzw. Objekte

mit deren Inhalte.

Danach können sie das Programm

schrittweise abarbeiten lassen.

Benutzen sie dazu "Step over".

Nun gibt es schon 2 Objekte 31

(17)

Debugger

Gehen sie nun auf einer der Variablen und drücken sie die rechte Maustaste.

Hier können sie, z.B.

- den Wert ändern

- die Variable in das Expressions-Fenster übernehmen

Debugger

• Benutzen sie den Debugger bei den Programmen, welche sie in Zukunft erstellen.

• Durch üben mit einfachen Programmen werden sie den Debugger in den Griff bekommen und auch bei komplexeren Programmen sinnvoll einsetzen können.

33

(18)

• Schreiben Sie nun eine Methode, welche einen Bruch kürzt

• -> GGT

GGT: Pseudocode

GGT von zahl1 und zahl2

Wiederhole solange zahl1 ungleich 0

Berechne den Rest r der Ganzzahldivision zahl1 / zahl2 Ersetze zahl1 durch zahl2.

Ersetze zahl2 durch den berechneten Rest.

Der letzte Wert von zahl1 ist der GGT.

35

(19)

GGT: Struktogramm

private int ggt(int zahl1, int zahl2) {

} // ggt

GGT: Code iterativ

// Iterativ

private int ggt(int zahl1, int zahl2) {

int rest;

while (zahl2 != 0) {

rest = zahl1 % zahl2;

zahl1 = zahl2;

zahl2 = rest;

} // while return zahl1;

} // ggt 37

(20)

//rekursiv

static int ggT(int zahl1, int zahl2) {

if (zahl1 == zahl2 ) return(zahl1);

else {

if (zahl1 > zahl2)

return(ggT(zahl1 – zahl2, zahl2));

else return(ggT(zahl2 - zahl1 , zahl1));

} // else } // ggt

Aufgaben Teil 2

• Lösen sie nun die Aufgaben 5 (Bruch kürzen)

• Vorstellung und Besprechung der Lösungen

39

(21)

Abschluss

• Unterschied Klassen / Objekte

• Konstruktoren

• Debugger

Hausaufgaben

- Repetition des heutigen Inhaltes.

- Buch Kapitel und Fragen erarbeiten

- Übungen fertigstellen, nochmals lösen, Fragen erarbeiten

41

Referenzen

ÄHNLICHE DOKUMENTE

Definition einer Klasse für komplexe Zahlen mit Methoden zum Setzen und zum Abfragen von Real- und Imaginärteil. Später können weitere Methoden zum Setzen und Abfragen von Betrag

Erstellen Sie eine Funktion fft() zur Berechnung der Fast Fourier Transformation eines Vektors aus komplexen Zahlen und testen Sie Ihre Funktion fft() mit einem

• Eine Klasse kann ein Interface auch dann implementieren, wenn sie nicht alle seine Methoden implementiert. • Die Klasse ist dann als abstrakte Klasse

Ziel: Entwicklung eines Tests für die Methode add() unter Verwendung von JUnit .... Automatische Tests mit JUnit Ein erstes

• Für 2/3 der Hausaufgaben Programmierteil müssen 2 oder mehr Punkte erreicht werden... Fragen

Wenn man über einen Container (z.B. Listen oder Arrays) iterieren will verwendet man FOR-EACH-Schleifen. for (TYPE name : variable)

ermitteln. Es ist zu berücksichtigen, dass der Nenner nicht den Wert 0 haben darf. a) Erstelle ein. Flussdiagramm zur Darstellung des Bruches b)