Modellierung und Programmierung 1 Prof. Dr. Sonja Prohaska Computational EvoDevo Group Institut für Informatik Universität Leipzig 9. Dezember 2015
Wiederholung Referenzdatentypen reference [0] M datatype char[] variable name array = new char array char[3]; [1] [2] u t class object (datatype) name String string String string custom class (datatype) object name reference constructor method = new String(array); = "Mut"; reference constructor method Text wort = new Text("Mut"); string String " M u t " object class wort Text Attribute
Wiederholung Klassen- vs. Instanzvariablen Klassenvariablen bezeichnen Attribute, die sich auf alle Objekte der Klasse beziehen, für alle Objekte gleich sind und nur für alle Objekte zusammen verändert werden können keyword: static Beispiel: static int objectcount; unveränderbare Klassenkonstante tragen zusätzlich das keyword final Beispiel: final static double PI; Instanzvariablen bezeichnen Attribute, die bei allen Objekte der Klasse eine unterschiedlichen Ausprägung haben können und individuell veränderbar sind default (kein Bezeichner notwendig)
Wiederholung Klassen- vs. Instanzmethoden Klassenmethoden bezeichnen Methoden, die auch ohne das Vorhandensein eines Objektes auf die Klasse angewendet werden können keyword: static Beispiel: static int getnumberofobjects() Aufruf: [Klasse].getNumberOfObjects() Instanzethoden bezeichnen Methoden, auch non-static methods genannt, die auf Objekte/Instanzen der Klasse angewendet werden default (kein Bezeichner notwendig) Beispiel: String getobjectid() Aufruf: [Objekt].getObjectID()
Klassen bestehen aus... Klassenname Attribute Liste von Klassenvariablen Liste von Instanzvariablen sie definieren den Datentyp Konstruktor(-methode) ist kein Konstruktor spezifiziert, greift der default-konstruktor Beispiel: [Klasse](); (minimaler Konstruktor) Aufruf: [Klasse] [object name] = new [Klasse](); ein Konstruktor hat keinen Rückgabetyp der Name jedes Konstruktors ist identisch mit dem Namen seiner Klasse wie bei anderen Methoden: es können Parameter übergeben werden Klassenmethoden Instanzmethoden
Beim letzten Mal... Klassen Memory, SpielFeld und Spieler Nutzung der Spezifikation der Struktur/des Datentypes Deklaration, Definition und (teilweise) Initialisierung der Attribute Nutzung des default-konstruktors Diese Mal... Konstruktor für die Klasse SpielFeld Instanzmethoden: mischen der Karten anzeigen des Spielfeld (4 Varianten) ispair() überprüft, ob die Karten (m1, n1) und (m2, n2) ein Paar bilden removepair() die Karten (m1, n1) und (m2, n2) entfernt
Konstruktor SpielFeld() legt ein Objekt an mit Struktur und initialen Werten für die Attribute spezifiziert durch Attribute der Klassen zusätzlich wird das Spielbrett brett[][] definiert und mit den Zahlen für die Kartenpaare initialisiert danach werden die Karten gemischt das Objekt muss nicht über this angesprochen
Klasse SpielFeld Karten mischen Instanzmethode: void mischen() die Variablen m1, n1, m2, n2, dummy sind lokal das Objekt, dessen Karten gemischt werden sollen, wird mit this (this object) angesprochen Manipulation der Instanzvariablen (hier die Elemente von brett) ändert die Werte des gegebenen Objekts
Klasse SpielFeld Spielbrett anzeigen a) c) b) d) a) keine der vorhandenen Karten aufgedeckt b) (alle vorhandenen Karten aufgedeckt) c) EINE der vorhandenen Karten aufgedeckt d) ZWEI der vorhandenen Karten aufgedeckt Welche Karten noch auf dem Spielbrett vorhanden sind, kann dem Array brett[][] des Objekts spiel entnommen werden.
Klasse SpielFeld Spielbrett anzeigen Die Instanzmethode printbrettopen() heisst überladen, weil mehrere Methoden mit dem selben Namen aber unterschiedlicher Parameterliste existieren. Zwei Parameter Koordinaten EINER Karte int m1, int n1 Vier Parameter Koordinaten ZWEIER Karten int m1, int n1, int m2, int n2
Klasse SpielFeld Paare erkennen Instanzmethoden mit Rückgabewert es kann nur ein Wert (auch eine Referenz) zurückgegeben werden es kann mehrere Rückgabeanweisungen geben der Rückgabewert muss dem Rückgabetyp entsprechen alle denkbaren Methodendurchläufe müssen in einer Rückgabeanweisung enden
This won t work! Why? Was passiert wenn die beiden Karten kein Paar bilden?
Klasse SpielFeld Paare entfernen Methoden können (andere) Methoden aufrufen removepair() ruft ispair() auf der Rückgabewert von ispair() wird an der Stelle des Aufrufes eingesetzt der Rückgabewert true von removepair() bestätigt dem aufrufenden Programm das Entfernen des Paars
Memory erste Schritte in Richtung OOP soweit die Erfolge: Nutzung der Klasse SpielFeld nicht nur als Datentyp sondern auch zur Bereitstellung von Werkzeugen diese Werkzeuge (Methode) dienen der Lösung von Teilaufgaben Übersichtlicheres Hauptprogramm zum Vergleich: progs06/memory.java progs07/memory.1.java progs07/memory.java weitere Modularisierung möglich (und nötig!)
Methoden die Methoden aufrufen Rekursion Lexikoneintrag: Re kur sion, die, siehe Rekursion Rekursion: eine Methode a() ruft sich selbst wieder auf wechselseitige Rekursion: eine Methode a() ruft Methode b() auf, welche Methode a() aufruft potentiell unendliche Nutzen in der Mathematik und Informatik Zurückführen einer komplexen Aufgabe auf eine einfachere Aufgabe derselben Klasse solange bis der Aufgabe per Definition eine Lösung zugewiesen werden kann Beispiel: berechnen der Summe der natürlichen Zahlen bis einschließlich n
Rekursion im Alltag I Ich weiß, dass du weißt, dass ich weiß, dass du weißt,... I Ein Hund kam in die Ku che und stahl dem Koch ein Ei... I Spiegel im Spiegel I Matryoschka (russische Puppen)
Rekursion vs. Iteration Rekursion vier ((1+1)+1)+1 (1+1)+1 1+1 1 eine! n n 1 (n 1) 1 ((n 1) 1) 1= 1 Iteration eine 1 1+1 (1+1)+1 vier ((1+1)+1)+1 n n 1 (n 1) 1 ((n 1) 1) 1= 1 Rekursion ist oft eleganter, während Iteration effizienter ist.
Rekursion Berechnen von n! (n-fakultät) Übung: RekursivFakultaet.java
Rekursion Berechnen von n! (n-fakultät) Übung: IterativFakultaet.java
Referenzdatentyp String Besondere Eigenschaften Strings sind Objekte der Klasse String Strings erzeugen direkte Konstruktion von String-Objekten aus String-Literalen Beispiel: String name = "Rainer Maria Rilke"; Konkatenation von Strings mit dem Plus-Operator Beispiel: String name = "R. "+ "M. "+ "Rilke"; automatisches Umwandeln von anderen Datentypen zu String Beispiel: String z = "Nummer: "+ 51; explizites Umwandeln von anderen Datentypen zu String Beispiel: String s = "Nummer: "+ tostring(51); aus einem Array von Werten des Typs char Beispiel: char[] triplet = { c, a, t }; String codon = new String(triplet); Strings kopieren String s1 = "cat"; Falsch: String s2 = s1; (kopiert nur die Referenz) Richtig: String s2 = new String(s1); Strings vergleichen Falsch: s2 == s1; (vergleicht Speicheradressen) Richtig: s1.equals(s2) oder s2.equals(s1)
String Methoden