Title: JAVA und OOP
1JAVA und OOP
- Teil 2 Objektorientierung
2Objektorientierung
- Daten und Methoden bilden eine Einheit
- Daten können nur mit festgelegten Methoden
geändert werden - Methoden können nicht auf fremde Daten angewandt
werden.
3Ziele der Objektorientierung
- Höhere Datensicherheit (durch Kapselung)
- Erleichterte Pflege des Quellcodes (durch
Kapselung) - Höhere Produktivität (durch Vererbung)
- Verbesserte Zugangskontrolle im Quellcode (durch
Getter- und Setter Methoden)
4Klassen
- Eine Klasse stellt den Bauplan für verschiedene
aber gleichartige Dinge (Objekte) dar. - In der Klasse werden die möglichen Eigenschaften
der Objekte und ihre Verhaltensweisen in Form von
Methoden festgelegt.
5Objekte
- Ein Objekt gehört grundsätzlich zu einer Klasse
- Es gibt jedoch auch sogenannte abstrakte Klassen
(abstract classes), die über keinerlei Objekte
verfügen.
6Instanzen
- Konkretisierung eines Objekts
- Instanzen benötigen
- realen Speicherplatz mit
- realen Werten.
7Das Programm fahrkarte
- Das Programm fahrkarte simuliert eine Fahrkarte
für den öffentlichen Nahverkehr.
8Eigenschaften einer Fahrkarte
- Anzahl der Tarifzonen
- Datum
- Reduzierter Preis?
- Fahrpreis
9Vorgänge im Fahrkartenautomaten (Methoden)
- Karte drucken
- Fahrpreis berechnen (von der Fahrstrecke
abhängen ) - Karten zu ermäßigtem Preis?
- Vierfachnetzkarte
- Zählwerk
10Kapselung (encapsulation)Prinzip
- Möglichst alle Variablen sind intern vereinbart
(private). - Zugang nur über Getter- und Setter-Methoden
11Kapselung (encapsulation)Vorteile
- Sicherheit gegen Änderungen von außen
- Sicherheit bei Veränderungen im Innern
- Vereinfachte Nutzung
- Verringerte Dokumentationslast
- Zugangsberechtigungen
12Klassenkonstanten (class constants)
- Die Konstante dPreisProZone wird der Klasse
fahrkarte selbst zugeordnet, es handelt sich
somit um eine Klassenkonstante.
13Attribute von dPreisProZone
- final Inhalt kann nicht geändert werden
- static Klassenkonstante
- double Inhaltstyp (Kommazahl).
final static double dPreisProZone1.3 final
static double dPreisProZoneReduziert0.6
14Klassenvariable (class fields)
- Beispiel Die Gesamtzahl aller in unserem
Automaten erstellten Fahrkarten. - Inhalt kann nicht in einer Konstanten gespeichert
werden, da sich der Wert laufend ändert. - Es macht wenig Sinn, diese Information einer
einzelnen Fahrkarte zuzuordnen. - Folgerung Klassenvariable
static int iVerkaufteKarten0
15Kontrollfragen
- Unterscheiden Sie Klasse und Instanz auf der
Grundlage der Programmiersprache JAVA - Welche Eigenschaften (properties) einer Fahrkarte
sollten Ihrer Meinung nach als Klassenkonstanten
, Instanzvariablen oder als Klassenvariablen
deklariert werden? Begründen Sie Ihre Antwort! - Beschreiben Sie das Konzept der Kapselung.
- Nennen Sie Vorteile der Kapselung
16Vererbung
- Neue Definition Klasse dauerkarte als
Erweiterung von fahrkarte - Methoden und Eigenschaften, die dauerkarte von
fahrkarte übernimmt, nennt man vererbte Methoden
(inherited). - fahrkarte ist Superklasse (superclass) zu
dauerkarte. - dauerkarte ist von fahrkarte abgeleitet.
- Jeder Dauerkarte besitzt alle Eigenschaften und
Methoden einer normalen Fahrkarte !
- package eins.munz.fahrkarte
- public class dauerkarte extends fahrkarte
17Erweiterungen zu Fahrkarten
- Erweitern Sie die Ausgabemethode für die
Dauerkarten so, dass die Inhabernamen mit
ausgedruckt werden. - Ändern Sie das Konzept Kartenzahl so ab, dass
nach Erreichen eines Schwellenwertes beim
Ausdrucken einer Fahrkarte ein entsprechender
Hinweis erscheint.
18Verwandte Aufgaben
- Realisieren Sie die folgenden Ideen in Ihrem
Programm. - Wenn man gleichzeitig Hin- und Rückfahrt bucht,
reduziert sich der Gesamtpreis. - Wie wärs mit einer Rabattstaffel für Großkunden?
- Wer ein Fahrrad oder einen Hund im Bus befördern
möchte, braucht eine besondere Fahrkarte. - Sonntags fahren alle (auch Hunde) zum reduzierten
Preis!
19Weitere Klassendefinitionen
- Formulieren Sie schriftlich in Umgangssprache
(also ohne JAVA) eine mögliche Klassendefinition
(mit Eigenschaften und Methoden) für folgende
Alltagsgegenstände - Getränkedosen
- Autos
- Computermaus
- Bücher in einem Ausleihesystem
- Abiturnoten eines Schülers bzw. einer Schülerin
20Standardkreis
- Eigenschaften
- Mittelpunktskoordinaten
- Radius
- Methoden
- Flächeninhalt berechnen
- Umfang berechnen
- feststellen, ob er sich mit einem anderen Kreis
schneidet.
21kreis2.java
- public class kreis2
- public int iMitteX,iMitteY, iRadius
- public double dUmfang, dInhalt
-
- public static double PI()
- return Math.atan(1)4
-
- public void dRechneUmfang()
- dUmfang2PI()iRadius
-
- public void dRechneInhalt()
- dInhaltPI()iRadiusiRadius
-
- public int iAnzahlSchnittpunkte(kreis2 k)
-
22Konstruktor zu kreis2.java
- / Creates new kreis2 constructor/
- public kreis2(int iMitteX,int iMitteY, int
iRadius) -
- this.iMitteXiMitteX
- this.iMitteYiMitteY
- this.iRadiusiRadius
- dRechneUmfang()
- dRechneInhalt()
-
23kreis3.java
- public class kreis3
- private int iMitteX,iMitteY, iRadius
- private double dUmfang, dInhalt
- private void dRechneUmfang()
- dUmfang2Math.PIiRadius
- private void dRechneInhalt()
- InhaltMath.PIiRadius
iRadius -
24Setter
- public void setRadius(int iRadius)
- this.iRadiusiRadius
- dRechneUmfang()
- dRechneInhalt()
-
25Ausgabe
- public void ausgabe()
- System.out.println("Radius "iRadius)
- System.out.println("Umfang "dUmfang)
- System.out.println("Flächeninhalt
"dInhalt) -
26Objekte vergleichen
- public boolean equals(kreis3 k2)
-
- return (this.iRadiusk2.iRadius)
- (this.iMitteXk2.iMitteX)
- (this.iMitteYk2.iMitteY)
-
27Schule
Schule NameSchulklassen ..........................
. Versetzung durchführen neue Schulklasse erzeugen
28Schulklasse
Schulklasse NameSchüler Gewichtung
schriftlich-mündlich Klassenlehrer Schnitt aller
Gesamtnoten ......................................
...... Schnitt berechnen neuen Schüler erzeugen
29Schüler
SchülerName Durchschnittsnote schriftliche
Note mündliche Note bestanden ....................
................. Noten eingeben Notenschnitt
berechnen feststellen, ob bestanden
30Attribute
- public
- Die Variable oder Methode ist in der Klasse
selbst, in an-geleiteten Klassen und in
übergeordneten Klassen, die unsere Klasse
aufrufen, sichtbar (liberale Variante). - private
- Die Variable oder Methode ist nur in der Klasse
sichtbar. in der sie vereinbart wurde (sichere
Variante). Untergeordnete (abgeleitete) oder
übergeordnete (aufrufende) Klassen sehen diese
Variable nicht. - protected
- Variablen mit diesem Attribut sind in der eigenen
Klasse und in abgeleiteten Klassen sichtbar.
Aufrufer sehen diese Variablen nur, wenn sie im
gleichen Paket aufrufen.
31Überladung
- Zwei Prozeduren mit gleichem Namen, die sich
aufgrund der Anzahl bzw. Typen der Parameter
unterscheiden.
32Überladung (Beispiel)
public schulemain(String name)
this.sNamename System.out.println(sName)
schulemain gymLoerrach new
schulemain("Gymnasium Loerrach")
--------------------------------------------------
---------------------
//zweiter Konstruktor / überladen public
schulemain() this.sName"Die arme Schule hat
keinen Namen." System.out.println(sName)
schulemain gymLoerrach new schulemain()
33Die Klasse schulklasse
- public class schulklasse
- public String sName
- private String sLehrer
- private double dGewichtung
-
- / Creates new schulklasse /
- public schulklasse(String name, String lName,
double gewichtung) - this.sNamename
- this.sLehrerlName
- this.dGewichtunggewichtung
- System.out.println
- (this.sName" "this.sLehrer" "
this.dGewichtung) -
34Aufrufe von schulklasse
- schulklasse klasse1new schulklasse("11a",
Munz",1.5) - schulklasse klasse2new schulklasse("12a",
"Henne",2)
35Die Klasse schueler
- public class schueler
- public String sName
- private double dDurchschnitt
- protected boolean bHatBestanden
- private int iMuendlich
- private int iSchriftlich
-
- public void ausgabe(String Klassenname)
- System.out.print(Klassenname" ")
- System.out.print(this.sName" ")
- System.out.print(this.dDurchschnitt" ")
- System.out.println(this.bHatBestanden)
-
36Setter und Konstruktor
- public void SetSchuelerdaten(String name, double
schnitt,boolean hatBestanden, int muendlich, int
schriftlich) - this.sNamename
- this.dDurchschnittschnitt
- this.bHatBestandenhatBestanden
-
- / Creates new schueler /
- public schueler(String name)
- SetSchuelerdaten(name,0,false,0,0)
- ausgabe("test")
-
37Testmethoden
Methode Eingabe(n) Setter Methode AusgabeGetter Meth. Ergeb-nis Da-tum Tes-ter
Konstruktor SCHULE-MAIN "Gymnasium Loerrach" "Gymnasium Loerrach" ok 29.12.01 Pl
Konstruktor SCHUL-KLASSE ("11a",Munz",1)("7b","Henne",3)("8a","Lost",1.5) ("11a",Munz",1)("7b","Henne",3)("8a","Lost",1.5) ok 29.12.01 He
setNoten 0,01,123,3213,1212,13 0,01,123,3213,1212,13 ok neg Ein-gab. feh-len 30.12.01 Pl
38Weiterführende Testaufgaben
- 1) Testen sie Ihr Programm gemäß den oben
beschriebenen Methoden. - 2) Entwerfen Sie weitere Testfälle.
- 3) Lösen Sie die im Text erwähnten Probleme.
- 4) Definieren Sie vier verschiedene
Standardschüler(innen) bzw. Standardklassen, die
möglichst viele Testfälle abdecken. - 5) Konzipieren Sie weitere Methoden zur
Oberstufenverwaltung. - 6) Informieren Sie sich bei Ihrer Schulleitung
über die tat-sächlich für die Oberstufenverwaltung
eingesetzte Software. Welche Methoden der
kommerziellen Software könnten Sie ebenfalls
erstellen?
39Container
- Definition
- WINDOWS Fenster der obersten hierarchischen Stufe
(das allumfassende Fenster, in dem das gesamte
Programm abläuft). - Name
- contentPane, zusammen gesetzt aus content
Inhalt und Pane (Fenster-) Scheibe.
40Layout
Grid
Flow
Border
41Beispiel Euro
- Erstellen Sie ein JAVA Programm, das einen
Eurobetrag in eine andere Währung (z.B. US
Dollar) umrechnet. Verwenden Sie eine GUI -
Oberfläche für das Programm. - Passen Sie die Umrechnung dem aktuellen
Dollarkurs an. - Erweitern Sie das Programm so, dass auch
Schweizer Franken umgerechnet werden können.
42Temperaturumrechnung
- Nach Eingabe einer Temperatur in Grad Celsius ist
die Angabe in Grad Réaumur und Grad Fahrenheit
umzurechnen. Dabei gelten folgende Umrechnungen
0C 0R 32F und 100C80R212F. - Ändern Sie Teil 1) wie folgt ab Nach Eingabe
einer Temperatur in Grad Celsius in Grad Réaumur
oder in Fahrenheit sind die jeweils anderen
Temperaturen zu berechnen. - Fügen Sie eine Kelvin-Skala ein.
43- Auerbacher TelekomIhre Rechnung
- Rechnungsdatum 27.1.02
- Rechnungsmonat Januar 2002
- Kundennummer 1234567890
- Munz Udo
- Blauenstr. 47
- 79589 Binzen
-
- Artikel oder Leistung Menge Nettobetrag
Nettogesamtbetrag Ust in -
- T- DSL Telefonanschluss 1 28,55 28,55 16
- 83 City-Verbindungen 106 0,0264 2,80 16
- 29 Deutschlandverbindungen 250 0,0396 9,90 16
-
- T-DSL Flat 21,55 16
-
- ZWISCHENSUMME xxx
- Umsatzsteuer 16 auf xxx yyy
44Telefon-rechnung
- Erstellen Sie ein JAVA - Programm, das aus der
Anzahl der genutzten Telefoneinheiten den
Gesamtpreis inkl. Grundgebühr berechnet. Die
Preise entnehme man der oben abgebildeten
Telefonrechnung. Der Grundpreis und die Gebühr
einer einzelnen Telefoneinheit sollen als lokale
Konstante (final) realisiert werden.
45Aufgaben 1-3
- Erweitern Sie das Programm Telefon so, dass der
Grundpreis und der Preis für eine einzelne
Gebühreneinheit auf der Oberfläche sichtbar sind. - Erstellen Sie ein entsprechendes Programm für
Handy- Gebühren. Es genügt, die Gebühren zur
Standardnutzerzeit (höchste Gebührenklasse) zu
errechnen. Eingegeben wird nun nicht mehr die
Anzahl der Gebühreneinheiten, sondern die
Gesamtzeit der Verbindungen. - Schreiben Sie ein JAVA - Programm, das nach
Eingabe der Anzahl den Kaufpreis für Disketten
(bzw. CD-Rohlinge) inklusive 16 Mehrwertsteuer
bestimmt.
46Aufgaben 4-6
- Erweitern Sie das Programm so, dass mehrere
Produkte (z.B. CD-Rohlinge und Disketten und
Tintenpatronen und...) geordert werden können.
Das Programm soll alles fein säuberlich auf der
Oberfläche auflisten und den Gesamtpreis
berechnen. - Erstellen Sie ein Programm, das Antwort auf die
Frage gibt Wie lange kann ich mit einem
vorgegebenen Betrag telefonieren? Man
differenziere nach Entfernungszonen. - Rechnen Sie einen in Sekunden vorgegebenen Wert
um in eine Zeitangabe von Tagen, Stunden, Minuten
und Sekunden.
47Aufgaben 7-8
- Rechnen Sie einen in Tagen, Stunden, Minuten und
Sekunden vorgegebenen Wert in eine Zeitangabe von
Sekunden um. - Berechnen Sie aus zwei Zeitangaben eines Tages
die Dauer der Zeitspanne dazwischen in Sekunde
48Münzen zählen
- Erstellen Sie ein einfaches Zählprogramm, das
Euromünzen durch Mausklick aufsummieren soll.
Die Benutzeroberfläche soll verschiedene Buttons
für verschiedene Münzen enthalten und das
Ergebnis (Summe) anzeigen.
49Komponenten
- Notwendige Komponenten
- Mindestens sieben verschiedene Buttons zur
Eingabe - Anzeige für das Endergebnis
- Überschrift
- Hilfreiche Komponente Fehlerkorrektur
- Letzte Eingabe (Mausklick) rückgängig machen.
50Banknotenaufgaben
- Erweitern Sie das Programm so, dass auch die
Beträge von Euroscheinen abgearbeitet werden
können. - Ordnen Sie die Buttons in einer Form an, die
ergonomisch sinnvoll ist. Dabei müssen nicht
alle Buttons gleich groß bleiben. Erläutern Sie
Ihren Ansatz. - Wie kann man mehrere Eingaben rückgängig machen?
- Ist es sinnvoll, jede Eingabe auch in der Ausgabe
anzuzeigen?
51Elementarer Kreis
- Der Radius r bleibt konstant, der Winkel w gegen
die Horizontale ändert sich zwischen Null und 2
(Bogenmaß!).
52Polarkoordinaten
- Radius und Winkel legen den Punkt fest
53Kreis und Spirale
54Kreisaufgaben 1-3
- Wie ändert sich das Ergebnis, wenn man die
Schleife bis 4Pi laufen läßt? - Ändern Sie die Schleife so, dass der Anfangswert
Null benutzt werden kann. - Überlegen Sie, ob man das Problem auch mit einer
for-Schleife lösen könnte. Begründen Sie Ihr
Ergebnis.
55Kreisaufgaben 4-6
- Erstellen Sie ein Konzept für eine Kreisprogramm
ohne Polarkoordinaten. - Erzeugen Sie aus dem Kreisprogramm die
Graphikdarstellung einer Spirale. Welche
Änderungen sind nötig? - Was berechnet folgende Anweisung dPi
Math.atan(1)4.0 ?
56Array
- Mehrere Variablen des gleichen Grundtyps
(primitive type, z.B. int oder double), die den
gleichen Variablennamen tragen und durch einen
ganzzahligen Index unterschieden werden können. - Der Index beginnt stets bei Null und endet dort,
wo der maximale Index erreicht ist. Dieser
maximale Index wird bei der Deklaration
festgelegt. Eine Vereinbarung der Form feld
int20 reserviert den Speicherplatz für 21 (!)
Integervariablen.
57ArrayLists
- Ähnelt in Funktion dem Array, kann jedoch
dynamisch, also zur Run-Time (Laufzeit),
erweitert werden!
58Variable vom Typ ArrayList
- protected static ArrayList
- alFeldnew ArrayList()
- Static
- alFeld.add(BigInteger.valueOf(1))
- alFeld.add(BigInteger.valueOf(1))
59Fibonacci Folge
- 1,1,
- 1,1,2,
- 1,1,2,3,
- 1,1,2,3,5,
- 1,1,2,3,5,8
- 1,1,2,3,5,8,13,...
an1anan-1 für n N, ngt1 und a11
a21
60Fibo rechnet neues Folgeglied
- public static BigInteger fibo(int i)
- for (int iLaengealFeld.size()iLaengeltiiLaenge
) - BigInteger letzteFibo
- (BigInteger) alFeld.get(iLaenge-1)
- BigInteger vorletzteFibo
- (BigInteger) alFeld.get(iLaenge-2)
- BigInteger naechsteFibo
letzteFibo.add(vorletzteFibo) - alFeld.add(naechsteFibo)
-
- return (BigInteger) alFeld.get(i-1)
-
61Fibo Hauptprogramm
- public static void main(String args)
-
- for (int iLauf111 iLauflt141 iLauf)
- System.out.println(fibo(iLauf))
- System.out.println(fibo(115))
- System.out.println(fibo(140))
- System.out.println(fibo(141))
-
62Fibonacci Ausgabe
- 4517090495650391871408712937
- 7308805952221443105020355490
- 11825896447871834976429068427
- 19134702400093278081449423917
- 30960598847965113057878492344
- 50095301248058391139327916261
- 81055900096023504197206408605
- ...............
- 781774079430987230203437
- 1264937032042997393488322
- 2046711111473984623691759
- 3311648143516982017180081
- 5358359254990966640871840
- 8670007398507948658051921
- 14028366653498915298923761
- 22698374052006863956975682
- 36726740705505779255899443
- 59425114757512643212875125
- 96151855463018422468774568
- 155576970220531065681649693
- 251728825683549488150424261
- 407305795904080553832073954
- 659034621587630041982498215
- 1066340417491710595814572169
- 1725375039079340637797070384
- 2791715456571051233611642553
63Arrays sortieren über Minimum
- arraySort sucht man in einem bestehenden Feld
zuerst das kleinste Feldelement (Minimum),
sichert es in einer Hilfsvariablen, verschiebt
alle darunter liegenden Feldelemente um eine
Position nach oben und heftet das zuvor gerettete
Minimum ans Ende des Feldes. Damit haben wir das
Minimum sicher im letzten Feldelement unter
gebracht. - Im nächsten Durchgang sucht man nur noch bis zum
vorletzten Element nach einem Minimum und
verfährt erneut wie oben. Mit jedem Durchgang
sitzt ein weiteres Element an der richtigen
Stelle.
64Sortierfortschritt
9216 7489 4291 8611 1430 8334 4020 9400 899 2787
9216 7489 4291 8611 1430 8334 4020 9400 2787 899
9216 7489 4291 8611 8334 4020 9400 2787 1430 899
9216 7489 4291 8611 8334 4020 9400 2787 1430 899
9216 7489 4291 8611 8334 9400 4020 2787 1430 899
9216 7489 8611 8334 9400 4291 4020 2787 1430 899
9216 8611 8334 9400 7489 4291 4020 2787 1430 899
9216 8611 9400 8334 7489 4291 4020 2787 1430 899
9216 9400 8611 8334 7489 4291 4020 2787 1430 899
65Sortieraufgaben 1-3
- Erweitern Sie das oben beschriebene Verfahren so,
dass eine wirklich große Anzahl Integerzahlen
sortiert werden kann. - Verändern Sie das obige Programm so, dass nach
Bestimmung des Minimums nur ein einziger Tausch
erfolgt (aktuelles Minimum an den Schluss,
dortige Zahl an bisherige Position des Minimums).
- Führen Sie den oben beschriebenen
Sortieralgorithmus mit einer ArrayList statt
einem Array durch. Welche Probleme tauchen auf?
66Sortieraufgaben 4-5
- Sortieren Sie ein Integerfeld bei der Entstehung.
Sobald ein neuer (Zufalls-)Wert berechnet wurde,
sucht man seine adäquate Position im Feld,
schafft Platz durch Verschieben (Nach oben oder
nach unten? Nach oben und unten?) und fügt
anschließend ein . - Sortieren Sie ein Integerfeld bei der Entstehung,
in dem Sie eine Vorsortierung einsetzen. Diese
funktioniert so, dass man bei jeder neuen Zahl
entscheidet, ob sie zur ersten oder zweiten
Hälfte des Felde gehört. Danach muss mit einem
anderen Verfahren genauer sortiert werden.
67Sortieraufgaben 6-8
- Sortieren Sie ein Integerfeld über die Bestimmung
des Maximums mit anschließendem Verschieben
innerhalb des Feldes. - Ändern Sie Ihr Sortierprogramm so ab, dass ein
String-Array String20 sortiert werden kann.
Benutzen Sie die Standardmethode compareTo.
(Siehe stringSort) - Bewerten Sie die verschiedenen Verfahren.
Welches Verfahren eignet sich für vorsortierte
Zahlen?
68Trigonometrische Tabelle
69Tabellenaufgaben 1-3
- Begründen Sie, warum im Beispiel Zufall1.java
nicht direkt nach den Strings sortiert wird,
sondern diese erst in Integer konvertiert werden. - Informieren Sie sich bei www.java.sun.com über
die Funktion Random(). Welche Wirkung hat ein
Parameter? - Erweitern Sie unsere trigonometrische Tabelle auf
die Tangensfunktion. Beachten Sie eventuelle
Definitionslücken.
70Tabellenaufgaben 4-7
- Erstellen Sie eine Tabelle zur Umrechnung von
Bogen- in Gradmaß - Tabellieren Sie die Temperaturskalen Celsius,
Réaumur, Kelvin und Fahrenheit. - Bauen Sie das BubbleSort-Verfahren so um, dass
man wahlweise nach oben oder nach unten sortieren
kann. - Erweitern Sie das BubbleSort- Verfahren so, dass
ein einzelner Durchgang der inneren Schleife pro
Knopfdruck durchgeführt wird. So erkennt man,
wie die Tabelle immer weiter sortiert wird.