Einführung in die JavaProgrammierung Dr. Volker Riediger Tassilo Horn riediger|[email protected] WiSe 2012/13 1 Wichtig... ● Mittags keine Pommes... ● Praktikum ● ● ● A 230 → C 207 (Madeleine + Esma) ● F 112 → F 113 (Kevin + Ich?) ● E 413 → E 313 (Jan) Evaluation Teilnahmebescheinigungen: E-Mail an [email protected] 2 Rückblick ● Rechen(un)genauigkeit ● Arrays als Referenztypen ● Mehrdimensionale Arrays 3 Heutige Themen ● Erste Einblicke in die objektorientierte Programmierung 4 Objektorientierte Programmierung ● Motivation: Wir erinnern uns, dass Fließkommazahlen (double) nicht beliebig präzise sind 2.05 – 0.05 // = 1.9999999999998 ● Es ist aber 2.05 = 41/20, 0.05 = 1/20, so dass wir präzise mit den Brüchen rechnen können 41/20 – 1/20 = 40/20 = 2/1 = 2 ● Leider gibt es in Java keinen Datentyp für rationale Zahlen :-( 5 Rationale Zahlen ● Analog zur Darstellung von Punkten mittels mehrerer Variablen, könnten wir auch Brüche mit 2 Variablen darstellen int a_z = 41; int a_n = 20; int b_z = 1; int b_n = 20; int c_z = a_z – b_z; int c_n = a_n; 6 Rationale Zahlen ● Blöd wird es, wenn die Nenner nicht gleich sind: int a_z = 41; int a_n = 3; int b_z = 1; int b_n = 4; // Wir müssen auf Nenner 12 erweitern int c_z = a_z * 4 – b_z * 3; int c_n = 3 * 4; 7 Rationale Zahlen ● Ein wenig besser wird es, wenn wir Brüche als Arrays der Länge 2 auffassen int[] a = {41, 3}; int[] b = {1, 4}; // Wir müssen auf Nenner 12 erweitern int[] c = {a[0] * b[1] – b[0] * a[1], a[1]*b[1]}; // Die Rechnung an sich ist immer noch // unübersichtlich! 8 Rationale Zahlen ● Was wir eigentlich sagen wollen, ist in etwa: Rational a = 41/3; Rational b = 1/4; // Um richtiges erweitern wollen wir uns // nicht selbst kümmern müssen! Rational c = a - b; System.out.println(c); // Ausgabe??? 9 Wunsch ● Wir möchten einen eigenen Datentyp Rational definieren ● ● Wir wollen alle arithmetischen Operationen mit Werten dieses Typs nutzen können Wir (als Programmierer, die diesen Typ benutzen) wollen uns nicht um Nebensächlichkeiten wie Erweitern, Kürzen, etc. kümmern 10 Klassen & Objekte ● ● Eine Klasse ist ein (Referenz-)Datentyp Eine Klasse beschreibt die Eigenschaften, die Werte dieses Datentyps haben ● ● ● Zunächst beschränken wir uns darauf, dass eine Eigenschaft eine Variable (Attribut) ist Frage: Welche Eigenschaften hat eine rationale Zahl? Einen Wert vom Typ einer Klasse nennt man meist Objekt oder Instanz der Klasse 11 Klassen & Objekte ● Ohne es zu wissen, haben wir schon die ganze Zeit mit Klassen und Objekten gearbeitet String ist eine Klasse "Alice" ist ein Objekt der Klasse String ● ● Im Gegensatz dazu sind alle klein geschriebenen Typen (int, long, double, boolean) keine Klassen, sondern sog. primitive Typen Nicht wichtig, aber der Vollständigkeit halber: Ein Array ist ein Objekt, aber int[] ist keine Klasse 12 Demo: Rational.java ● Aufgabe: Schreibe eine Klasse Rational, welche die Eigenschaften (Bestandteile) einer rationalen Zahl als Attribute deklariert ● ● Aus welchen Bestandteilen besteht eine rationale Zahl? Grundgerüst einer Klasse: public class MyClass { // Deklaration der Bestandteile // als Attribute } 13 Erzeugung von Objekten ● ● ● Um ein Objekt einer Klasse zu erzeugen, muss die Klasse einen Konstruktor definieren Ein Konstruktor ist eine spezielle Methode, die genau wie die Klasse heißt und keinen Return-Typ deklariert Beispiel: public class MyClass { public MyClass(double x, int y) { // Initialisiere Attribute anhand von // den gegebenen Parametern } } 14 Demo: Rational.java ● Aufgabe: Definiere einen Konstruktor für unsere Klasse Rational ● ● Welche Parameter sollte dieser Konstruktor bekommen? Gibt es ungültige Parameterwerte? 15 Erzeugung von Objekten ● ● Definiert eine Klasse einen Konstruktor, so kann man ein Objekt dieser Klasse mit dem von Arrays bekannten new-Operator erzeugen Beispiel: MyClass mc = new MyClass(1.4, 17); 16 Demo: Rational.java ● Aufgabe: Erstelle in unserer RationalKlasse eine main()-Methode und erzeuge dort ein paar Rational-Objekte ● Gib die erzeugten Objekte mit System.out.println() aus 17 Ein Ausgabeformat definieren ● ● Falls ein Objekt (für die Ausgabe) in einen String konvertiert wird, dann ruft Java automatisch eine Methode toString() auf Möchte man ein eigenes Ausgabeformat definieren, dann kann man in seiner eigenen Klasse einfach eine toString()-Methode definieren public class MyClass { // kein static: diese Methode gehört Objekten // der Klasse, nicht der Klasse an sich public String toString() { // Ausgabe-String x berechnen return x; } } 18 Demo: Rational.java ● Aufgabe: Definiere eine toString()Methode für unsere Rational-Klasse ● ● Ist der Nenner gleich 1, dann soll einfach der Zähler (als String) zurückgegeben werden Ansonsten soll die übliche Form "Zähler/Nenner" verwendet werden 19 Demo: Kürzen! ● Prima, bis jetzt können wir rationale Zahlen ● ● ● erzeugen (Konstruktor mit new aufrufen) ausgeben (da toString() geeignet definiert wurde) Aufgabe: Verbessere unsere Rational-Klasse derart, dass alle rationalen Zahlen automatisch gekürzt werden! System.out.println(new Rational(2, 4)); // Es soll 1/2 statt 2/4 ausgegeben werden 20 Demo: Kürzen! ● ● ● Aufgabe: Verbessere unsere Rational-Klasse derart, dass alle rationalen Zahlen (Brüche) automatisch gekürzt werden! Idee: Direkt bei der Initialisierung von Zähler und Nenner im Konstruktor kürzen Regel zum Kürzen: ??? 21 Demo: Kürzen! ● ● ● Aufgabe: Verbessere unsere Rational-Klasse derart, dass alle rationalen Zahlen (Brüche) automatisch gekürzt werden! Idee: Direkt bei der Initialisierung von Zähler und Nenner im Konstruktor kürzen Regel zum Kürzen: ● Bestimme den ggT von Zähler und Nenner ● Dividiere Zähler und Nenner durch den ggT 22 Demo: Multiplizieren ● Aufgabe: Ergänze unsere Rational-Klasse um eine Methode mul(), mit der wir eine rationale Zahl mit einer anderen rationalen Zahl multiplizieren können ● Die Methode soll unser Rational-Objekt nicht verändern, d.h. dessen Attribute ändern, sondern es soll ein neues Rational-Objekt zurückgegeben werden 23 Demo: Dividieren ● Aufgabe: Ergänze unsere Rational-Klasse um eine Methode div(), mit der wir eine rationale Zahl durch eine anderen rationalen Zahl dividieren können ● ● Es soll wieder ein neues Rational-Objekt zurückgegeben werden Frage: Wie dividiert man rationale Zahlen (Brüche)? 24 Demo: Dividieren ● Aufgabe: Ergänze unsere Rational-Klasse um eine Methode div(), mit der wir eine rationale Zahl durch eine anderen rationalen Zahl dividieren können ● ● Es soll wieder ein neues Rational-Objekt zurückgegeben werden Frage: Wie dividiert man rationale Zahlen (Brüche)? – Einfach mit dem Kehrwert multiplizieren 25 Demo: Addieren ● Aufgabe: Ergänze unsere Rational-Klasse um eine Methode add(), mit der rationale Zahlen addieren können ● ● Es soll wieder ein neues Rational-Objekt zurückgegeben werden Frage: Wie addiert man rationale Zahlen (Brüche)? 26 Demo: Addieren ● Aufgabe: Ergänze unsere Rational-Klasse um eine Methode add(), mit der rationale Zahlen addieren können ● ● Es soll wieder ein neues Rational-Objekt zurückgegeben werden Frage: Wie addiert man rationale Zahlen (Brüche)? – Man muss die Brüche auf den gleichen Nenner bringen (erweitern)! 27 Demo: Subtrahieren ● Aufgabe: Ergänze unsere Rational-Klasse um eine Methode sub(), mit der rationale Zahlen voneinander subtrahiert werden können ● ● Es soll wieder ein neues Rational-Objekt zurückgegeben werden Frage: Wie subtrahiert man rationale Zahlen (Brüche)? 28 Demo: Subtrahieren ● Aufgabe: Ergänze unsere Rational-Klasse um eine Methode sub(), mit der rationale Zahlen voneinander subtrahiert werden können ● ● Es soll wieder ein neues Rational-Objekt zurückgegeben werden Frage: Wie subtrahiert man rationale Zahlen (Brüche)? – Na klar, einen der Brüche negieren und dann addieren 29 Demo: Vergleichen ● ● ● Soweit können wir rationale Zahlen ● erzeugen ● ausgeben ● und damit Rechnen Was uns noch fehlt ist eine Möglichkeit, rationale Zahlen zu vergleichen Klassen sind Referenztypen, bei denen man mit equals() einen inhaltlichen Vergleich macht 30 Demo: Vergleichen ● Aufgabe: Füge der Rational-Klasse eine equals()-Methode hinzu, mit der man zwei Rationalzahlen vergleichen kann 31 Demo: Nach double konvertieren ● Aufgabe: Füge der Rational-Klasse eine toDouble()-Methode hinzu, die eine Fließkommarepräsentation der rationalen Zahl liefert 32 Für die Übung ● ● Wer in der Übung gerne eine OO-Aufgabe lösen möchte, der kann gerne die folgende Aufgabe bearbeiten Aufgabe: Erstelle nach dem Muster der Klasse Rational eine Klasse Complex, mit der sich komplexe Zahlen darstellen lassen ● Die Rechenregeln sind einfacher als bei Rational und sind auf der Wikipedia gut beschrieben 33