Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6
Algorithmen und Datenstrukturen 06
Stefan Ploner
29. November 2011
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6
1 Besprechung Blatt 5 O-Kalk¨ul
Praxisaufgaben
2 Objektorientierte Programmierung Allgemein
Referenzen Sichtbarkeit Konstanten 3 Vorbereitung Blatt 6
Anmerkungen
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 O-Kalk¨ul
Umgang mit Schleifen
for (int i = 0; i < n; i++) for (int j = 0; j < n; j*=2)
doSomethingSimple(); // O(1)
Bestimmung des O-Kalk¨uls hier trivial O(n·logn)
for (int i = 0; i < n; i++) for (int j = 0; j < i; j*=2)
doSomethingSimple(); // O(1)
Bestimmung des O-Kalk¨uls hier nicht trivial, sondern wie in der letzten ¨Ubung besprochen z.B. ¨uber die gaußsche Summenformel!
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 O-Kalk¨ul
Im Hinblick auf die Klausur...
• triviale Ausdr¨ucke durch “Hinschauen” auswerten (spart Zeit)
• f¨ur komplizierte Gebilde sollte man vor allem die gaußsche Summenformel verstanden haben
• wenn nicht explizit anders gefordert kann der am schnellsten ansteigende Teil einer Summe einfach abgelesen werden:
O(logn)∈O(n1a)∈O(n)∈O(na)∈O(an)∈O(n!)∈O(nn) mit a>1
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 O-Kalk¨ul
• Mysterious Sort war Radix Sort (F¨achersortierung)
• im Beispiel wird in jedem Schleifendurchlauf nach dem i-ten Bit der Integer Zahlen sortiert
• dabei beginnt man mit dem least significant Bit und arbeitet sich der Reihe nach zum highest significant Bit vor
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Praxisaufgaben
Fibonacci Zahlen
fn= 1
√ 5
"
1 +√ 5 2
!n
− 1−√ 5 2
!n#
Generell empfiehlt es sich nicht, einen Term dieser Gr¨oße in eine einzelne Zeile zu schreiben!
Leicht entsch¨arfte Version: Zeilenumbr¨uche an sinnvollen Stellen return 1 / Math.sqrt(5) *
(Math.pow((1 + Math.sqrt(5)), n) - Math.pow((1 - Math.sqrt(5)), n));
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Praxisaufgaben
Fibonacci Zahlen
fn= 1
√ 5
"
1 +√ 5 2
!n
− 1−√ 5 2
!n#
Alternativ kann man zun¨achst Teile berechnen und in Variablen speichern:
double front = 1 / Math.sqrt(5);
double left = Math.pow((1 - Math.sqrt(5)) / 2, n);
double right = Math.pow((1 - Math.sqrt(5)) / 2, n);
return front * (left - right);
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Praxisaufgaben
Binomialkoeffizienten
n!
k!·(n−k)!
K¨urzen von n!k!
int result = 1;
for (int i = k + 1; i < n; i++) result *= i;
Um m¨oglichst viel zu k¨urzen und so weit wie m¨oglich rechnen zu k¨onnen, sollte man gegebenenfalls k durch (n-k) ersetzen.
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Praxisaufgaben
Noch Fragen zu Blatt 5?
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Allgemein
Warum Klassen?
• umso mehr (unstrukturierter) Code, desto weniger ¨Uberblick
• Projekte werden aus ¨uberschaubaren Klassen zusammengesetzt
• beim Erstellen einer Klasse kann man externen Code ausblenden
• beim Verwenden einer Klasse braucht man sich ¨uber die interne Umsetzung keine Gedanken machen
• an abgeschlossenen Klassen k¨onnen sp¨ater einfacher Korrekturen vorgenommen werden, auch ohne den
Gesamtzusammenhang des Programms genau zu verstehen
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Allgemein
Bestandteile einer Klasse
1 Variablen
2 Methoden
3 Konstruktoren
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Allgemein
Zugeh¨ origkeit zu Klasse oder Instanz
• static: Klassenvariable / -methode
• sonst: Instanzvariable / -methode
• Instanzmethoden k¨onnen auf statische Variablen und Methoden zugreifen. (eindeutig einer Klasse zugeordnet)
• Aber nicht umgekehrt!Die Klasse kann nicht wissen, auf welche Instanz zugegriffen werden soll.
• Statische Klassen k¨onnen sogar dann aufgerufen werden, wenn keine Instanz existiert (main-Methode, Math-Klasse, ...)
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Allgemein
Das new-Schl¨ usselwort
• Klassen werden mit ihren statischen Variablen beim Programmstart angelegt
• Instanzen m¨ussen w¨ahrend der Ausf¨uhrung erstellt werden class Beispiel {
public static void main(String[] args) {
// Neue Instanz der Klasse Beispiel erstellen Beispiel b = new Beispiel();
} }
Mit demnew-Schl¨usselwort wird der Konstruktor aufgerufen.
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Allgemein
Konstruktoren
• Ist kein Konstruktor im Code vorhanden, ist automatisch ein public-zugreifbarer, parameterloser Konstruktor verf¨ugbar
• Sobald irgendein Konstruktor geschrieben wird, ist der automatische nicht mehr verf¨ugbar! (Man kann ihn nat¨urlich wieder von Hand hinzuf¨ugen)
class Beispiel {
// so sieht der default-Konstruktor aus:
public Beispiel() { } }
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Referenzen
Referenzen
class Beispiel { String name;
public Beispiel(String name) { this.name = name;
}
public static void main(String[] args) { Beispiel b = new Beispiel("test");
} }
Was wird der Variable b eigentlich zugewiesen?
• Eine Referenz zu dem Ort im Speicher, an dem die Instanz angelegt wurde
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Referenzen
Referenzsemantik
int i = 2;
int j = i; // kopieren des Variablenwerts Beispiel b = new Beispiel("test");
Beispiel c = b; // kopieren des Variablenwerts (?)
Es wird die Referenz / die Speicheradresse der Instanz kopiert!
c.name = "ein anderer Test";
System.out.println(b.name); // "ein anderer Test"
• Da beide Referenzen auf die selbe Instanz zeigen, wirken sich Anderungen gegenseitig aus.¨
• Das ¨Ubergeben einer Referenz in einem Funktionsaufruf hat die selbe Auswirkung
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Referenzen
Referenzsemantik
Beispiel b = new Beispiel("test");
Beispiel c = b;
if (b == c)
System.out.println("gleich");
• Ein Vergleich zweier Referenzen liefert dann true, wenn sie auf die selbe Instanz zeigen.
• Der Vergleich von 2 verschiedenen Instanzen mit gleichem Inhalt liefert false!
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Referenzen
Referenzsemantik
// String von der Konsole lesen
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
if (input == "test") // Immer false!
System.out.println("gleich");
• Auch String ist eine Klasse / Strings sind Instanzen
• Da die nextLine()-Methode eine neue String-Instanz erstellt, zeigt sie immer an einen anderen Speicherort als ”test”
• Selbst wenn test eingegeben wird, ist die Bedingung false
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Referenzen
NullPointer(-Exception)
int[][] matrix = new int[4][]; // 4 Zeilen
matrix[0] = new int[3]; // 3 Spalten in Zeile 0 System.out.println(matrix[0][1]); // 0
System.out.println(matrix[2][0]); // NullPointerException
• Auch Arrays sind Referenzen
• int[][] matrix ist ein Referenz-Array, das auf mehrere normale Integer-Arrays zeigt
• Referenzen haben den Standardwert null (Zeiger ins nichts)
• Auf eine nicht vorhandene Instanz kann nicht zugegriffen werden⇒ NullPointerException
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Sichtbarkeit
Sichtbarkeitsmodifikatoren
• Sch¨utzen Klassen vor ungewollten Eingriffen
• Meist interessiert der innere Aufbau gar nicht Klasse Package Unterklassen alle
private + - - -
default + + - -
protected + + + -
public + + + +
• Gesch¨utzte Variablen k¨onnen m¨oglicherweise ¨uber ¨offentliche Getter und Setter doch erreicht werden
• Erm¨oglichen Schutz vor ¨Anderungen und Wertebereiche
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Konstanten
Konstanten
• Keywordfinal vor den Variablennamen
• zum Sicherstellen (oder Klarstellen) der Unver¨anderlichkeit
• nur einmal zuweisbar
• final-Klassenvariablen m¨ussen am Ende jedes Konstruktors initialisiert sein (Bei der Deklaration oder im Konstruktor)
• bei final-Referenzen ist nur die Referenz konstant, nicht das referenzierte Objekt!
• unter Umst¨anden Performancegewinn
Anmerkung: Das Keywordfinal existiert auch bei Methoden und Klassen
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Anmerkungen
• Zips werden nicht auf unerlaubte Zeichen gepr¨uft!
• Sofern nicht anders verlangt, d¨urfen Instanzvariablen verwendet werden!
• Trotzdem bitte nur dann, wenn sie auch n¨otig sind
Besprechung Blatt 5 Objektorientierte Programmierung Vorbereitung Blatt 6 Anmerkungen
Java char
• Nicht nur ASCII oder 255 Zeichen, sondern 16-Bit-Unicode.
• Daher lassen sich auch gr¨oßere int Zahlen in char konvertieren und umgekehrt.
Nicht alle ASCII Codes repr¨asentieren “normale” Textzeichen!