Martin Häcker/Java Kurs/Tag 2
Inhaltsverzeichnis
LE 3: Modularisierung mit Klassen und Objekten
Vortragende: Martin, Felix
Inhalt
- Modularisierung als erstes
- Sammlung von Methoden
- static -> ABER ERKLÄREN!!!!!!
- Dann höhere Datenstrukturen
- Als zusammenfassung von Attributen
- Beispiel: Point(x, y)
- Weg von static
- new erklären
- Call by Reference: Beispiel: Fernbedienung
- Referenzen sind _NICHT_ kopien
- Gleich beim Array: Obwohl das kein
- Call by Reference: Beispiel: Fernbedienung
- initialisierung von hand
- initialisierung per init methode
- init in objekt schieben
- init in konstruktor umwandeln -> DAS ist der übergang zu Objektorientierung
- Als zusammenfassung von Attributen
- Dann das zusammen als Verkapselung der Datenstrukturen
- damit man sie ändern kann
- Point(theta, phi)
- Hier ohne static, und erklären wieso und was unterschied
- damit man sie ändern kann
DAS ist Objektorientierung! Daher, wenn man OO Programmiert, braucht man static so gut wie nie.
- Elefantenbeispiel
Klassen nächstes Abstraktionswerkzeug nach Methoden
- Wichtiges Gedankengut: Eine Sprache die mehrere verschiedene Abstraktionswerkzeuge: hat vielleicht zu viele?
- Mächtigkeit einer Sprache invers zur Anzahl der Abstraktionsmöglichkeiten?
Beispiele:
- Point
- PseudoRandomNumberGenerator
- Uhr
- Counter
- Liste (argh) (auf Arrays implementiert)
- Element löschen -> null rein
Alle Aufgaben: Objekt Bauen, aber innnendrinn die Implementierung ändern. (Vielleicht aber auch erst später)
Übungsaufgaben
Syntax-Kram
- meinPferd = deinPferd; (Referenz != Kopie)
- normale methode aus static aufrufen
- Variable verwenden bevor initialisiert
Große Aufgabe
- Ziel
- Kleine Studentendatenbank in der Studenten eingefügt und gesucht werden können.
- Advanced
- mit löschen
- Idee
- "Statistik" : Anzahl der Studenten, durchschnittliches Alter, bla
- Aufgaben
- Schreibe eine Klasse, die Informationen wie Name, Matrikelnummer etc. über einen Studenten speichert. Erzeuge ein Objekt dieser Klasse und belege die Objektvariablen mit Werten. Lese diese Werte aus den Objektvariablen wieder aus und gib sie auf dem Bildschirm aus.
- Schreibe einen Konstruktor für deine Klasse, der die Objektvariablen des erzeugten Objekts mit Werten füllt. Erzeuge mit Hilfe dieses Konsturktors ein Objekt, lies seine Werte aus und gib sie auf dem Bildschirm aus.
- Erweitere deine Klasse um eine Methode
public void printMe()
, die die Daten des Studentenobjekts auf dem Bildschirm ausgibt. Teste deine Methode! - Lege eine Feld (Array) mit 100 Studentenobjekten an, die verschiedene Matrikelnummern haben und gib all auf dem Bildschirm aus.
- Diese Feld ist schon eine Art Studentendatenbank. Schreibe daher eine neue Klasse
StudentenDatenbank
, die eine Feld von Studentenobjekten enthält. Die Klasse soll einen Konstruktor haben, dem die Größe des zu erzeugenden Feldes übergeben wird. Implementiere auch eine MethodeprintMe
, die alle Datensätze ausgeben soll, sowie eine MehtodestudentHinzufuegen()
, die einen Studentenobjekt mit den zu übergebenen Daten anlegen soll und dieses in die Datenbank einfügen soll. - Erweitere die Studentendatenbank um eine Methode
studentEntfernen()
, die das Studentenobjekt mit der übergebenen Matrikelnummer aus der Datenbank löschen soll. Funktionert nach dem Löschen einiger Objekte deine Ausgabemethode (printMe()
) noch? - Erweitere die Studentendatenbank um eine Methode
studentenAnzahl()
, die die Anzahl der in der Datenbank gespeicherten Studentenobjekte zurückliefert.
- Zeitbedarf
- Arthur: Aufgaben 1-5 zusammen ca. 1h
- Sven : Aufgaben 1-7 zusammen etwa 1h hätte ich kate+bash benutzt schätz ich mal (angenehme aufgabe)
- Fragen
- soll private / public / default / protected thematisiert werden? (Arthur+Sven)
- soll sich deren array in der DB von sich aus vergrößern? (Sven)
- evtl. verwirrend das bei den methodenNamen hinten in der aufgabe ein "()" ist obwohl ja parameter übergeben werden? (Sven)
- gibt es eine musterlösung? wäre für die übungen denke ich sinnvoll damit dort alle tutoren auf die aufgabe klarkommen.. und am ende ähnliche ergebnisse haben ;) (Sven)
LE 4: OO-Vertiefung und Klassenbibliothek
Vortragende: Arthur, Kristian, Robert Lubkoll
High-Level-Plan
- Objekt, Vererbung (bischen), Interfaces (bischen)
- try/catch
- API (bischen)
Inhalt
Syntax Wiederholung: (Bild!)
- static
- final
- null, this
Objekte als Abstraktionsmöglichkeit nutzen
- Interfaces kurz anritzen?
- Alles von Objekt abgeleitet
- Instanziierung (auch Erklärung Mehrdeutigkeit von "Objekt" für Klasse oder Instanz)
- Beispiel: Ausprobieren mit equals(), toString()
- Overloading / Polymorphie (so wenig wie möglich)
- Standardmethoden: toString, equals, hash, compare (brauchen wir da interfaces?)
- Gotchas: Strings vergleichen mit == oder equals?
Exceptions
- try / catch
Austauschbarkeit der internen Implementierung, sollte dazu führen das man Objekte besser Wiederbenutzen kann als klassischen Imperativen Code. Das hat aber nicht soo gut funktioniert wie gedacht. ABER immerhin: es gibt Klassenbibliotheken.
- Java-API: Konzept Klassenbibliothek
- Javadocs finden, lesen: javadocs.org/Klassenname (vorsicht, linkt nach Java 5)
- Input/Output (Streams, usw.) <-- großer Block
- Streams: InputReader, BufferedReader, Scanner
- Collections: List, ArrayList
Mehr Klassen vielleicht verlinkt - zum selber anschauen: Math
Übungsaufgaben
Ziel: Ein IOUtility-Objekt schreiben, das Eingabe und Ausgabe in Java einfach macht und die Studentendatenbank mit Hilfe der API um schöne neue Funktionen erweitern.
Advanced: IOUtility erweitern, das es Input/Output quasi wie ein iterator durchführt.
Idee: Verwendung der Java-API lernen.
Meta-Anweisung: Jede der Methoden in dieser Aufgabe ist so zu programmieren, das ihr zuerst in euere main()-Methode einen Aufruf schreibt und das Ergebnis ausgebt um zu Zeigen, wie ihr die Methoden verwenden wollt. Auf jeden Fall muss am Ende der Aufgabe eine main()-Methode existieren die von jeder Methode demonstriert das sie funktioniert. Wird eure main()-Methode zu lang, könnt ihr teile davon in testXXX()-Methoden auslagern damit ihr die Übersicht behaltet.
Aufgaben:
- Schlage die Methode Math.random() nach und verwende sie um die Arbeit der zentralen Verwaltung zu erleichtern, indem jeder Student eine zufällige Hauptdiplom-Note zugewiesen bekommt.
- Implementiere die methode toString() für die Studenten- und Studidatenbank-Klasse. Verändere printMe() in beiden Klassen so, das sie diese neue Methode verwenden. Hinweis: Ein Student soll dabei so ausgegeben werden, dass erst die Matrikelnummer und dann, nach einem Leerzeichen, der Name ausgegeben wird. Beispiel: "123456 Lieschen Müller". Die Datenbank soll so ausgegeben werden, das erst alle Studenten, pro Student eine Zeile, geschrieben werden. Danach noch eine Zeile (die mit einem Leerzeichen oder Tab beginnt) in der etwas Statistik über die Datenbank ausgegeben wird. Interessant sind: Die Anzahl der Studenten, deren durchschnittliche Noten...
- Lese den Javadoc zu ArrayList und verwende die ArrayList als interne Datenstruktur für die Studentendatenbank. Wie verändern sich die Methoden add(), search() und delete()? Gibt es Instanz-Variablen die jetzt nicht mehr gebraucht werden?
- Implementiere eine equals() Methode für Student, die zwei Studenten als gleich betrachtet, wenn sie die gleiche Matrikelnummer haben. Nutze equals() um eine Methode zu schreiben die zeigt, dass ein neuer Student, der in der Datenbank eingefügt wird equals() zu dem Student ist, der unter dieser Matrikelnummer in der Datenbank nachgeschlagen werden kann.
- Recherchiere die notwendigen Java-Klassen die man für Ausgabe benötigt. FileOutputStream vor allem die Konstruktoren, OutputStreamWriter für die geerbte Methode write(String). Verwende dieses Wissen um ein neues Objekt "IOUtility" zu schreiben, dass diese Klassen verwendet, um einen String in eine Datei zu schreiben. Benutze diese Methode um die Studiendatenbank in eine Datei auszugeben. Hinweis: Verwende auch hier die toString()-Methode.
- Lese den Javadoc zu den Klassen die man benötigt um eine Datei einzulesen: FileInputStream um mit den Konstruktoren eine Datei zu öffnen, BufferedReader um eine Datei Zeilenweise readLine() zu lesen und InputStreamReader um den FileInputStream und den BufferedReader kombinieren zu können.
Verwende diese Klassen das IOUtility-Objekt um eine Methode zu erweitern, die eine Datei in einzelnen Zeilen in eine ArrayList einließt und diese Zurückgibt. Danach implementiere eine Methode die eine eine ganze Datei als ein String zurückgibt. Hinweis: Verwende dabei die vorher implementierte Methode. - Benutze diese Methoden um eine Studentendatenbank aus einer Datei einzulesen, in der jede Zeile so aussieht: "234234 Heinz Kunz" Das heißt, erst die Matrikelnummer, dann ein Leerzeichen und dann der Name des Studenten bis zum Rest der Zeile. Vorsicht: beginnt eine Zeile nicht mit der Matrikelnummer sondern mit etwas anderem, ist sie zu verwerfen. Hilfreiche Methoden: substring(), split(), startsWith()
- Benutze dein Wissen um die Eingabe um eine Methode promptUserForString(String) zu schreiben, die den übergebenen String dem Benutzer auf der Konsole anzeigt und seine Antwort als String zurückgibt. Schreibe danach noch eine Methode promptUserForInt(String), die diese Methode verwendet aber einen int zurückgibt. Hinweis: Man benötigt dafür System.in. Schreibe mit dieser Methode ein Menü für die Studentendatenbank die es erlaubt die Datenbank aus einer Datei einzulesen, und in einer anderen Datei zu sichern. Hinweis: Am einfachsten ist es ein Menü auszugeben, in dem jede Wahl eine Nummer hat, die der Benutzer dann eingibt. Wählt er eine ungültige Zahl, kann man einfach eine Fehlermeldung und das Menü ausgeben und eine neue Eingabe verlangen.
Advanced Aufgabe für Leute denen das Vorher alles zu Langweilig war:
- Erweitere das IOUtility-Objekt so, dass man es mit einem Dateinamen Instanziiert. Danach kann man mit den Methoden startReading() bzw. startWriting() die Klasse in einen Zustand bringen, der entweder Lesen oder Schreiben aus der Datei mit den Methoden readLine() bzw. writeLine() erlaubt. Die Methode readLine() soll dabei null zurückgeben, wenn die Datei zuende gelesen wurde.
- Erweitere das Menü der Studentendantenbank, so das es erlaubt:
- Eine Standarddatenbank zu erzeugen
- Einen Studenten zu suchen
- Einen neuen Studenten einzufügen
- Die Hauptdiplom-Note eines Studenten einzutragen.
An die Tutoren
Eingabe und Ausgabe unter Java ist nicht besonders Elegant - vor allem, wenn man bei einer Aufgabe die Vorteile des Stream-Konzepts überhaupt nicht nutzen kann. Die Studenten sollen daher ein Objekt schreiben das ihnen diese Aufgaben erleichtert. Ein Entferntes Vorbild ist uns dabei eine Input-Klasse die wir an der Princeton-Universität gefunden haben.