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
• 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
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
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
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
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
Ü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
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
Ü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
• 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
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
• 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
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
• 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
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
• 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
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
• 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
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
//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
Abschluss
• Unterschied Klassen / Objekte
• Konstruktoren
• Debugger
Hausaufgaben
- Repetition des heutigen Inhaltes.
- Buch Kapitel und Fragen erarbeiten
- Übungen fertigstellen, nochmals lösen, Fragen erarbeiten
41