Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

Martin Häcker/Java Kurs/Tag 2: Unterschied zwischen den Versionen

(LE 4: OO-Vertiefung und Klassenbibliothek: änderung, jetzt kommt der vortrag von Kristian und Robert Lubkoll)
(Übungsaufgaben: erster entwurf noch nicht fertig)
Zeile 137: Zeile 137:
  
 
== Übungsaufgaben ==
 
== Ü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
 +
 +
'''Idee:''' Verwendung der Java-API lernen.
 +
 +
'''Aufgaben:'''
 +
# Math.random() nachschlagen
 +
## Verwenden um randomStudi() zu erstellen
 +
# equals() methode für Studi implementieren
 +
## suche nach studenten mit equals realisieren -> nach Namen suchen
 +
# toString() für studi und Studidatenbank implementieren und für die Ausgabe verwenden
 +
# ArrayList nachschlagen
 +
## für die Studidatenbank verwenden
 +
## löschen() modifizieren
 +
 +
# Ausgabe Recherchieren
 +
## [http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileOutputStream.html FileOutputStream] lesen (konstruktor!)
 +
## [http://docjar.com/docs/api/java/io/OutputStreamWriter.html OutputStreamWriter] für die geerbte Methode [http://java.sun.com/j2se/1.3/docs/api/java/io/Writer.html#write(java.lang.String) write(String)]
 +
## benutzen um einen Methode zu schreiben die einen String erhält und ihn in eine Datei schreibt
 +
# Nutzt dieses Utility-Objekt um die Studiendatenbank in eine Datei auszugeben
 +
## verwende dazu die ''toString()''-Methode
 +
 +
# Eingabe recherchieren
 +
## [http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileInputStream.html FileInputStream] um eine Datei zu öffnen (besonders auf Konstruktoren achten)
 +
## [http://java.sun.com/j2se/1.4.2/docs/api/java/io/BufferedReader.html BufferedReader] um aus einem Reader zeilenweise zu lesen [http://java.sun.com/j2se/1.4.2/docs/api/java/io/BufferedReader.html#readLine() readLine()] (Konstruktor!)
 +
## [http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStreamReader.html InputStreamReader] um den FileInputStream in den BufferedReader hineinzubekommen. (Konstruktor!)
 +
## Datei als Zeilen-Array / ArrayList einlesen implementieren
 +
## Datei als ein String einlesen implementieren (vorherige Lösung verwenden)
 +
# Benutze diese Methoden um eine Studentenliste einzulesen in der jede Zeile so aussieht: "234234 name" Das heißt, erst die Matrikelnummer, dann ein Leerzeichen und dann der Name des studenten bis zum rest der Zeile
 +
 +
# Und wieder einzulesen
 +
## [http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#substring(int,%20int)) substring()], [http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#split(java.lang.String) split()]
 +
## Verwende dieses Wissen um
 +
 +
''Advanced Aufgabe:''
 +
# IOUtility erweitern
 +
## das man es mit einem Dateinamen instanziieren kann
 +
## das man dann mit ''readLine()'' die Datei zeilenweise lesen, bzw mit ''writeLine()'' schreiben kann
 +
## evtl braucht es noch eine ''startReading()'' bzw. ''startWriting()'' Methode
 +
### Überlegt, wie man das einsetzen kann um Fehler zu vermeiden
 +
 +
 +
=== Staging Area ===
 
* Tests in main schreiben -> Alles ausprobieren, mehr intuitiv
 
* Tests in main schreiben -> Alles ausprobieren, mehr intuitiv
  
 
StudiDatenbank erweitern:
 
StudiDatenbank erweitern:
* Suchen nach Namen (vorher nur nach MatrNr.) -> equals()
 
* Erstellen von randomStudi() -> Random
 
 
* Studis Comparable machen, dann Arrays.sort() (Vielleicht weg)
 
* Studis Comparable machen, dann Arrays.sort() (Vielleicht weg)
* Umstellen auf ArrayList (?Dann Sorting?)
 
  
 
* IO-Utility-Objekt
 
* IO-Utility-Objekt
** Einlesen Datei in String
 
** Zeilenweise
 
*** Zerlegen + einlesen Studidatenbank
 
 
** Einlesen von Tastatur
 
** Einlesen von Tastatur
 
*** Menü StudiBank Bauen (primitv)
 
*** Menü StudiBank Bauen (primitv)
 
** Ziel: readFile(aFilename) und getUserInput(aPrompt) [http://www.cs.princeton.edu/introcs/22inout/In.java.html sowas sollte rauskommen!]
 
** Ziel: readFile(aFilename) und getUserInput(aPrompt) [http://www.cs.princeton.edu/introcs/22inout/In.java.html sowas sollte rauskommen!]
 
+
** getIntFromUser()
  
 
[[Benutzer:Martin_Häcker/Java_Kurs | <- Zurück zur Übersicht]]
 
[[Benutzer:Martin_Häcker/Java_Kurs | <- Zurück zur Übersicht]]

Version vom 28. März 2006, 16:38 Uhr

<- Zurück zur Übersicht

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
    • initialisierung von hand
    • initialisierung per init methode
    • init in objekt schieben
    • init in konstruktor umwandeln -> DAS ist der übergang zu Objektorientierung
  • 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

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
  1. 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.
  2. 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.
  3. Erweitere deine Klasse um eine Methode public void printMe(), die die Daten des Studentenobjekts auf dem Bildschirm ausgibt. Teste deine Methode!
  4. Lege eine Feld (Array) mit 100 Studentenobjekten an, die verschiedene Matrikelnummern haben und gib all auf dem Bildschirm aus.
  5. 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 Methode printMe, die alle Datensätze ausgeben soll, sowie eine Mehtode studentHinzufuegen(), die einen Studentenobjekt mit den zu übergebenen Daten anlegen soll und dieses in die Datenbank einfügen soll.
  6. 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?
  7. 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

Idee: Verwendung der Java-API lernen.

Aufgaben:

  1. Math.random() nachschlagen
    1. Verwenden um randomStudi() zu erstellen
  2. equals() methode für Studi implementieren
    1. suche nach studenten mit equals realisieren -> nach Namen suchen
  3. toString() für studi und Studidatenbank implementieren und für die Ausgabe verwenden
  4. ArrayList nachschlagen
    1. für die Studidatenbank verwenden
    2. löschen() modifizieren
  1. Ausgabe Recherchieren
    1. FileOutputStream lesen (konstruktor!)
    2. OutputStreamWriter für die geerbte Methode write(String)
    3. benutzen um einen Methode zu schreiben die einen String erhält und ihn in eine Datei schreibt
  2. Nutzt dieses Utility-Objekt um die Studiendatenbank in eine Datei auszugeben
    1. verwende dazu die toString()-Methode
  1. Eingabe recherchieren
    1. FileInputStream um eine Datei zu öffnen (besonders auf Konstruktoren achten)
    2. BufferedReader um aus einem Reader zeilenweise zu lesen readLine() (Konstruktor!)
    3. InputStreamReader um den FileInputStream in den BufferedReader hineinzubekommen. (Konstruktor!)
    4. Datei als Zeilen-Array / ArrayList einlesen implementieren
    5. Datei als ein String einlesen implementieren (vorherige Lösung verwenden)
  2. Benutze diese Methoden um eine Studentenliste einzulesen in der jede Zeile so aussieht: "234234 name" Das heißt, erst die Matrikelnummer, dann ein Leerzeichen und dann der Name des studenten bis zum rest der Zeile
  1. Und wieder einzulesen
    1. substring(), split()
    2. Verwende dieses Wissen um

Advanced Aufgabe:

  1. IOUtility erweitern
    1. das man es mit einem Dateinamen instanziieren kann
    2. das man dann mit readLine() die Datei zeilenweise lesen, bzw mit writeLine() schreiben kann
    3. evtl braucht es noch eine startReading() bzw. startWriting() Methode
      1. Überlegt, wie man das einsetzen kann um Fehler zu vermeiden


Staging Area

  • Tests in main schreiben -> Alles ausprobieren, mehr intuitiv

StudiDatenbank erweitern:

  • Studis Comparable machen, dann Arrays.sort() (Vielleicht weg)
  • IO-Utility-Objekt
    • Einlesen von Tastatur
      • Menü StudiBank Bauen (primitv)
    • Ziel: readFile(aFilename) und getUserInput(aPrompt) sowas sollte rauskommen!
    • getIntFromUser()

<- Zurück zur Übersicht