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 3: Verfeinerung Java und Klassenbibliothek: arthur dazu)
(Übungsaufgaben: wikify)
 
(35 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 
[[Benutzer:Martin_Häcker/Java_Kurs | <- Zurück zur Übersicht]]
 
[[Benutzer:Martin_Häcker/Java_Kurs | <- Zurück zur Übersicht]]
  
= LE 3: Verfeinerung Java und Klassenbibliothek =
+
= LE 3: Modularisierung mit Klassen und Objekten =
'''Vortragende:''' Martin, Arthur
+
'''Vortragende:''' Martin, Felix
 +
* [http://www.freitagsrunde.org/~mhaecker/JavaKurs/Material/Modularisierung%20und%20Objekte.pdf Folien] - [[{{PAGENAME}}/Handout]]
 
== Inhalt ==
 
== Inhalt ==
 +
* Modularisierung als erstes
 +
** Sammlung von Methoden
 +
** static -> ABER ERKLÄREN!!!!!!
  
=== Java / Methodik ===
+
* 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
  
* '''Modularisierung und Strukturierung''' -- auf allen Ebenen
+
* Dann das zusammen als Verkapselung der Datenstrukturen
** Klassen (als Strukturen)
+
** damit man sie ändern kann
** Methoden-Kapselung: '''Methoden-Nachtrag'''
+
*** Point(theta, phi)
*** Methoden als Abstraktionsmöglichkeiten -> verstecken von methoden [http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-4.html#%25_toc_%25_sec_Temp_43] Bringts das an der stelle?
+
** Hier ohne static, und erklären wieso und was unterschied
  
* '''Testen'''
+
'''DAS ist Objektorientierung!''' Daher, wenn man OO Programmiert, braucht man static so gut wie nie.
** eigene assert-Funktion
+
* Elefantenbeispiel
  
'''Objektorientierung''' (Erklärungsansatz)
+
Klassen nächstes Abstraktionswerkzeug nach Methoden
* Objekt, Klasse erklären als: "Klasse" Mensch
+
* Wichtiges Gedankengut: Eine Sprache die mehrere verschiedene Abstraktionswerkzeuge: hat vielleicht zu viele?
** davon dann klonen mit bestimmten Modifikationen (augenfarbe, größe, name....)
+
* Mächtigkeit einer Sprache invers zur Anzahl der Abstraktionsmöglichkeiten?
** das wäre dann klasse, objekte und konstruktoraufruf
 
* Objekte / Klassen erklären als
 
** Platonische Ideen (Pferd)
 
** Tatsächliches Ding (Bruno auf dem ich jeden Dienstag in Hellersdorf reite)
 
* Objekte als Daten mit ''Schutzschicht'' Methoden aussen herum
 
** Klassen als solches erst später (quasi erst prototyp und dann klassen erklären)
 
* Ganz anderer Ansatz: Erklären über Einheiten die sich über Nachrichten gegenseitig verständigen
 
* Äquivalenz zu Funktionaler Programmierung aufmachen
 
** Constructor: Funktion die Parameter bekommt und eine Funktion zurückgibt die diese verkapselt
 
** Methoden: diese Funktion kann mit dem Namen verschiedener Methoden aufgerufen werden und wird, indem es diese ausführt, zum Objekt
 
  
'''Probleme beim Erklären'''
+
Beispiele:
* this, woher kommt das und wie verwendet man es!
+
* 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 ==
 
== Übungsaufgaben ==
  
* Selbst Klassen schreiben
+
=== Syntax-Kram ===
 +
* meinPferd = deinPferd; (Referenz != Kopie)
 +
* normale methode aus static aufrufen
 +
* Variable verwenden bevor initialisiert
  
= LE 4: Wir sind alle nur Objekte =
+
=== 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 <code>public void printMe()</code>, 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 <code>StudentenDatenbank</code>, 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 <code>printMe</code>, die alle Datensätze ausgeben soll, sowie eine Mehtode <code>studentHinzufuegen()</code>, die einen Studentenobjekt mit den zu übergebenen Daten anlegen soll und dieses in die Datenbank einfügen soll.
 +
# Erweitere die Studentendatenbank um eine Methode <code>studentEntfernen()</code>, die das Studentenobjekt mit der übergebenen Matrikelnummer aus der Datenbank löschen soll. Funktionert nach dem Löschen einiger Objekte deine Ausgabemethode (<code>printMe()</code>) noch?
 +
# Erweitere die Studentendatenbank um eine Methode <code>studentenAnzahl()</code>, 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)
 +
<!--
 +
* Selbst Klassen schreiben:
 +
 
 +
1.:
 +
Schreibe eine Klasse die informationen über einen Studenten speichert (....)
 +
Erzeuge ein Objekt dieser Klasse, schreibe einen Wert in eine ihrer Variablen, lese ihn anschließend wieder aus und gib ihn auf dem Bildschirm aus.
 +
 
 +
2.:
 +
schreibe einen Konstructor für die Klasse Student mit welchem die Variablen des erzeugten Objektes gleich mit Werten gefüllt werden. Erzeuge mit hilfe dieses Constructors ein Objekt, lies einen seiner Werte aus und gib ihn auf dem Bildschirm aus.
 +
 
 +
3:
 +
Schreibe eine Funktion "PrintMe" die die Daten des Studentenobkektes in der Console ausgibt und teste diese.
 +
 
 +
4:
 +
Lege ein Array mit 100 Studentenobjekten an welche verschiedene Matrikelnummern haben und gib alle auf dem Bildschirm aus.
 +
 
 +
5:
 +
Verlagere das Array in eine neue Klasse StudentenDatenbank und schreibe für diese die Methoden StudentHinzufuegen und PrintMe.
 +
 
 +
6:
 +
....
 +
-->
 +
 
 +
= LE 4: OO-Vertiefung und Klassenbibliothek =
 +
'''Vortragende:''' Arthur, Kristian, Robert Lubkoll
 +
 
 +
'''High-Level-Plan'''
 +
* Objekt, Vererbung (bischen), Interfaces (bischen)
 +
* try/catch
 +
* API (bischen)
  
 
== Inhalt ==
 
== Inhalt ==
 +
Syntax Wiederholung: (Bild!)
 +
* ''static''
 +
* ''final''
 +
* ''null'', ''this''
  
=== Java ===
+
Objekte als Abstraktionsmöglichkeit nutzen
 
+
* Interfaces kurz anritzen?
* '''Modularisierung in Java: Klassen und Objekte'''
+
* Alles von Objekt abgeleitet
 
** Instanziierung (auch Erklärung Mehrdeutigkeit von "Objekt" für Klasse oder Instanz)
 
** Instanziierung (auch Erklärung Mehrdeutigkeit von "Objekt" für Klasse oder Instanz)
** Referenzen (Pointer)
+
** Beispiel: Ausprobieren mit equals(), toString()
** insb: Referenzen sind nicht Kopien
+
** Overloading / Polymorphie (so wenig wie möglich)
** Overloading
+
** Standardmethoden: toString, equals, hash, compare (brauchen wir da interfaces?)
*** Standardmethoden: toString, ...
+
** Gotchas: Strings vergleichen mit == oder equals?
** Type Casting einfacher Basistypen?
 
  
* '''Objekte vertieft''': als Ansammlung von Daten mit Methoden dazu
+
Exceptions
** Konstruktoren
+
* try / catch
** um innendrinn auswechseln zu können
 
** ''static''
 
** Static nicht static: [http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-4.html#%25_toc_%25_sec_3.1.2 Benefits of Local State]
 
** ''final''
 
** ''null'', ''new''
 
** ''this''
 
** static / instanz -> Ebenen modell (?)
 
  
 +
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'''
 
* Java-API: Konzept '''Klassenbibliothek'''
** Javadocs finden, lesen
+
** Javadocs finden, lesen: javadocs.org/Klassenname (vorsicht, linkt nach Java 5)
* JavaDoc selber schreiben und verwenden -> http://www.javadocs.org
 
 
* Input/Output (Streams, usw.) <-- großer Block
 
* Input/Output (Streams, usw.) <-- großer Block
** List, ArrayList, InputReader, BufferedReader, Scanner
+
** Streams: InputReader, BufferedReader, Scanner
** Collections
+
** Collections: List, ArrayList
 +
Mehr Klassen vielleicht verlinkt - zum selber anschauen: Math
  
 
== Übungsaufgaben ==
 
== Übungsaufgaben ==
* Klassen benutzen:
+
Siehe: [[Javakurs2006/Tag_2]]
** Input/Output üben
 
** Viele andere Klassen aus der Java-API finden und nutzen
 
** Praktische Vorgehensweise, Anleitung zum Selbstlernen, nicht so viel Vorlesung dazu
 
 
 
* UtilityObjekt mit readFile(aFilename) und getUserInput(aPrompt) [http://www.cs.princeton.edu/introcs/22inout/In.java.html sowas sollte rauskommen!]
 
  
* Menü Objekt, das sich leicht adaptieren lässt?
 
* Apfelbaum
 
while (Apfelbaum.hatNochAepfel) {
 
        Apfel meinApfel = Apfelbaum.getApfel(); // Apfel pflücken
 
        ich.esse(meinApfel);
 
}
 
*  Collections, Polymorphie (Apfel mit Wurm....)
 
  
 
[[Benutzer:Martin_Häcker/Java_Kurs | <- Zurück zur Übersicht]]
 
[[Benutzer:Martin_Häcker/Java_Kurs | <- Zurück zur Übersicht]]

Aktuelle Version vom 3. April 2006, 12:10 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

Siehe: Javakurs2006/Tag_2


<- Zurück zur Übersicht