JAVA und OOP Teil 2: Objektorientierung
Objektorientierung 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.
Ziele 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)
Klassen 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.
Objekte Ein Objekt gehört grundsätzlich zu einer Klasse Es gibt jedoch auch sogenannte abstrakte Klassen ( abstract classes ), die über keinerlei Objekte verfügen.
Instanzen Konkretisierung eines Objekts: Instanzen benötigen -realen Speicherplatz mit -realen Werten.
Das Programm fahrkarte Das Programm f ahrkarte simuliert eine Fahrkarte für den öffentlichen Nahverkehr.
Eigenschaften einer Fahrkarte Anzahl der Tarifzonen Datum Reduzierter Preis? Fahrpreis
Vorgänge im Fahrkartenautomaten (Methoden) Karte drucken Fahrpreis berechnen (von der Fahrstrecke abhängen ) Karten zu ermäßigtem Preis? Vierfachnetzkarte Zählwerk
Kapselung (encapsulation) Prinzip Möglichst alle Variablen sind intern vereinbart (private). Zugang nur über Getter- und Setter- Methoden
Kapselung (encapsulation) Vorteile Sicherheit gegen Änderungen von außen Sicherheit bei Veränderungen im Innern Vereinfachte Nutzung Verringerte Dokumentationslast Zugangsberechtigungen
Klassenkonstanten (class constants) Die Konstante dPreisProZone wird der Klasse fahrkarte selbst zugeordnet, es handelt sich somit um eine Klassenkonstante.
Attribute von dPreisProZone final Inhalt kann nicht geändert werden static Klassenkonstante double Inhaltstyp (Kommazahl). final static double dPreisProZone=1.3; final static double dPreisProZoneReduziert=0.6;
Klassenvariable (class fields) Beispiel: Die Gesamtzahl aller in unserem Automaten erstellten Fahrkarten. o Inhalt kann nicht in einer Konstanten gespeichert werden, da sich der Wert laufend ändert. o Es macht wenig Sinn, diese Information einer einzelnen Fahrkarte zuzuordnen. o Folgerung: Klassenvariable static int iVerkaufteKarten=0;
Kontrollfragen 1) Unterscheiden Sie Klasse und Instanz auf der Grundlage der Programmiersprache JAVA ™ 2) Welche Eigenschaften ( properties ) einer Fahrkarte sollten Ihrer Meinung nach als Klassenkonstanten, Instanzvariablen oder als Klassenvariablen deklariert werden? Begründen Sie Ihre Antwort! 3) Beschreiben Sie das Konzept der Kapselung. 4) Nennen Sie Vorteile der Kapselung
Vererbung 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
Erweiterungen zu Fahrkarten 1. Erweitern Sie die Ausgabemethode für die Dauerkarten so, dass die Inhabernamen mit ausgedruckt werden. 2. Ändern Sie das Konzept „Kartenzahl“ so ab, dass nach Erreichen eines Schwellenwertes beim Ausdrucken einer Fahrkarte ein entsprechender Hinweis erscheint.
Verwandte Aufgaben Realisieren Sie die folgenden Ideen in Ihrem Programm. a) Wenn man gleichzeitig Hin- und Rückfahrt bucht, reduziert sich der Gesamtpreis. b) Wie wär’s mit einer Rabattstaffel für Großkunden? c) Wer ein Fahrrad oder einen Hund im Bus befördern möchte, braucht eine besondere Fahrkarte. d) Sonntags fahren alle (auch Hunde) zum reduzierten Preis!
Weitere 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
Standardkreis Eigenschaften Mittelpunktskoordinaten Radius Methoden Flächeninhalt berechnen Umfang berechnen feststellen, ob er sich mit einem anderen Kreis schneidet. M(mx,my) P(px,py)
kreis2.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() {dUmfang=2*PI()*iRadius;} public void dRechneInhalt() {dInhalt=PI()*iRadius+iRadius;} public int iAnzahlSchnittpunkte(kreis2 k) { }
Konstruktor zu kreis2.java /** Creates new kreis2 constructor*/ public kreis2(int iMitteX,int iMitteY, int iRadius) { this.iMitteX=iMitteX; this.iMitteY=iMitteY; this.iRadius=iRadius; dRechneUmfang(); dRechneInhalt(); }
kreis3.java public class kreis3 { private int iMitteX,iMitteY, iRadius; private double dUmfang, dInhalt; private void dRechneUmfang() { dUmfang=2*Math.PI*iRadius; } private void dRechneInhalt() { Inhalt=Math.PI*iRadius +iRadius;} }
Setter public void setRadius(int iRadius) { this.iRadius=iRadius; dRechneUmfang(); dRechneInhalt(); }
Ausgabe public void ausgabe() { System.out.println("Radius: "+iRadius); System.out.println("Umfang: "+dUmfang); System.out.println("Flächeninhalt: "+dInhalt); }
Objekte vergleichen public boolean equals(kreis3 k2) { return (this.iRadius==k2.iRadius) &&(this.iMitteX==k2.iMitteX) &&(this.iMitteY==k2.iMitteY); }
Schule Schule NameSchulklassen Versetzung durchführen neue Schulklasse erzeugen
Schulklasse Schulklasse NameSchüler Gewichtung schriftlich-mündlich Klassenlehrer Schnitt aller Gesamtnoten Schnitt berechnen neuen Schüler erzeugen
Schüler SchülerName Durchschnittsnote schriftliche Note mündliche Note bestanden Noten eingeben Notenschnitt berechnen feststellen, ob bestanden
Attribute 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.
Überladung Zwei Prozeduren mit gleichem Namen, die sich aufgrund der Anzahl bzw. Typen der Parameter unterscheiden.
Überladung (Beispiel) public schulemain(String name) { this.sName=name; 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();
Die 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.sName=name; this.sLehrer=lName; this.dGewichtung=gewichtung; System.out.println (this.sName+" "+this.sLehrer+" "+ this.dGewichtung); }}
Aufrufe von schulklasse schulklasse klasse1=new schulklasse("11a", „Munz",1.5); schulklasse klasse2=new schulklasse("12a", "Henne",2);
Die 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); }
Setter und Konstruktor public void SetSchuelerdaten(String name, double schnitt,boolean hatBestanden, int muendlich, int schriftlich) { this.sName=name; this.dDurchschnitt=schnitt; this.bHatBestanden=hatBestanden; } /** Creates new schueler */ public schueler(String name) { SetSchuelerdaten(name,0,false,0,0); ausgabe("test"); } }
Testmethoden MethodeEingabe(n) Setter Methode Ausgabe Getter Meth. Erge b-nis Da- tum Tes- ter Konstruktor SCHULE- MAIN "Gymnasium Loerrach" ok Pl Konstruktor SCHUL- KLASSE ("11a",„Munz",1) ;("7b","Henne",3 )("8a","Lost",1.5) ok He setNoten0,01,123,3213,12 12,13 ok; neg Ein- gab. feh- len Pl
Weiterfü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?
Container 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.
Layout Grid Flow Border
Beispiel: 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.
Temperaturumrechnung Nach Eingabe einer Temperatur in Grad Celsius ist die Angabe in Grad Réaumur und Grad Fahrenheit umzurechnen. Dabei gelten folgende Umrechnungen: 0°C = 0°R = 32°F und 100°C=80°R=212°F. Ä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.
Auerbacher Telekom Ihre Rechnung Rechnungsdatum RechnungsmonatJanuar 2002 Kundennummer Munz Udo Blauenstr Binzen Artikel oder Leistung Menge Nettobetrag Nettogesamtbetrag Ust in% T- DSL Telefonanschluss128,5528, City-Verbindungen1060,02642, Deutschlandverbindungen 2500,03969,9016 T-DSL Flat21,5516 ZWISCHENSUMMExxx Umsatzsteuer 16% auf xxxyyy Rechnungsbetragzzz
Telefon- 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.
Aufgaben Erweitern Sie das Programm Telefon so, dass der Grundpreis und der Preis für eine einzelne Gebühreneinheit auf der Oberfläche sichtbar sind. 2. 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. 3. Schreiben Sie ein JAVA - Programm, das nach Eingabe der Anzahl den Kaufpreis für Disketten (bzw. CD- Rohlinge) inklusive 16% Mehrwertsteuer bestimmt.
Aufgaben 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. 5. Erstellen Sie ein Programm, das Antwort auf die Frage gibt: Wie lange kann ich mit einem vorgegebenen Betrag telefonieren? Man differenziere nach Entfernungszonen. 6. Rechnen Sie einen in Sekunden vorgegebenen Wert um in eine Zeitangabe von Tagen, Stunden, Minuten und Sekunden.
Aufgaben Rechnen Sie einen in Tagen, Stunden, Minuten und Sekunden vorgegebenen Wert in eine Zeitangabe von Sekunden um. 8. Berechnen Sie aus zwei Zeitangaben eines Tages die Dauer der Zeitspanne dazwischen in Sekunde
Mü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.
Komponenten Notwendige Komponenten Mindestens sieben verschiedene Buttons zur Eingabe Anzeige für das Endergebnis Überschrift Hilfreiche Komponente: Fehlerkorrektur Letzte Eingabe (Mausklick) rückgängig machen.
Banknotenaufgaben 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?
Elementarer Kreis Der Radius r bleibt konstant, der Winkel w gegen die Horizontale ändert sich zwischen Null und 2 (Bogenmaß!). M(mx,my) P(px,py)
Polarkoordinaten Radius und Winkel legen den Punkt fest
Kreis und Spirale
Kreisaufgaben Wie ändert sich das Ergebnis, wenn man die Schleife bis 4Pi laufen läßt? 2. Ändern Sie die Schleife so, dass der Anfangswert Null benutzt werden kann. 3. Überlegen Sie, ob man das Problem auch mit einer for -Schleife lösen könnte. Begründen Sie Ihr Ergebnis.
Kreisaufgaben Erstellen Sie ein Konzept für eine Kreisprogramm ohne Polarkoordinaten. 5. Erzeugen Sie aus dem Kreisprogramm die Graphikdarstellung einer Spirale. Welche Änderungen sind nötig? 6. Was berechnet folgende Anweisung: dPi = Math.atan(1)*4.0 ?
Array 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 = int[20] reserviert den Speicherplatz für 21 (!) Integervariablen.
ArrayLists Ähnelt in Funktion dem Array, kann jedoch dynamisch, also zur Run-Time (Laufzeit), erweitert werden!
Variable vom Typ ArrayList protected static ArrayList alFeld=new ArrayList(); Static {alFeld.add(BigInteger.valueOf(1)); alFeld.add(BigInteger.valueOf(1));}
Fibonacci 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,... a n+1 =a n +a n-1 für n€ N, n>1 und a 1 =1 a 2 =1
Fibo rechnet neues Folgeglied public static BigInteger fibo(int i) {for (int iLaenge=alFeld.size();iLaenge<i;iLaenge++) { 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); }
Fibo Hauptprogramm public static void main(String args[]) { for (int iLauf=111; iLauf<141; iLauf++) {System.out.println(fibo(iLauf));} System.out.println(fibo(115)); System.out.println(fibo(140)); System.out.println(fibo(141)); }
Fibonacci Ausgabe
Arrays 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.
Sortierfortschritt
Sortieraufgaben Erweitern Sie das oben beschriebene Verfahren so, dass eine wirklich große Anzahl Integerzahlen sortiert werden kann. 2. 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). 3. Führen Sie den oben beschriebenen Sortieralgorithmus mit einer ArrayList statt einem Array durch. Welche Probleme tauchen auf?
Sortieraufgaben 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. 5. 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.
Sortieraufgaben Sortieren Sie ein Integerfeld über die Bestimmung des Maximums mit anschließendem Verschieben innerhalb des Feldes. 7. Ändern Sie Ihr Sortierprogramm so ab, dass ein String-Array String[20] sortiert werden kann. Benutzen Sie die Standardmethode compareTo. (Siehe stringSort ) 8. Bewerten Sie die verschiedenen Verfahren. Welches Verfahren eignet sich für vorsortierte Zahlen?
Trigonometrische Tabelle
Tabellenaufgaben Begründen Sie, warum im Beispiel Zufall1.java nicht direkt nach den Strings sortiert wird, sondern diese erst in Integer konvertiert werden. 2. Informieren Sie sich bei über die Funktion Random (). Welche Wirkung hat ein Parameter? 3. Erweitern Sie unsere trigonometrische Tabelle auf die Tangensfunktion. Beachten Sie eventuelle Definitionslücken.
Tabellenaufgaben Erstellen Sie eine Tabelle zur Umrechnung von Bogen- in Gradmaß 5. Tabellieren Sie die Temperaturskalen Celsius, Réaumur, Kelvin und Fahrenheit. 6. Bauen Sie das BubbleSort-Verfahren so um, dass man wahlweise nach oben oder nach unten sortieren kann. 7. 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.