Einführung in das Programmieren Probeklausur Lösungen Frederik Kanning 01.07.2013
Aufgabe 1 b/c) void definiert Methode ohne Rückgabewert return beendet aktuellen Methodenaufruf wenn Rückgabetyp nicht void: legt zusätzlich Rückgabewert fest muss angegeben werden
Aufgabe 1 b/c) Beispiel Methode ohne Rückgabe 1 void printnum(int num) { 2 if(num < 0) return; 3 Std.out.println(num); 4 } Methode mit Rückgabe 1 int half(int num) { 2 return num / 2; 3 // Compiler-Fehler; wird niemals erreicht: 4 Std.out.println(num); 5 }
Aufgabe 1 d) extends definiert Klasse als Unterklasse von bereits vorhandener Klasse Zugriff auf alle Methoden und Variablen der Oberklasse (außer private) Objekte können in Variablen mit Typ der Oberklasse gespeichert werden Unterklasse hat auch den Typ der Oberklasse ( zuweisungskompatibel ) Methoden mit gleicher Signatur (Name, Parameter) werden ersetzt ersetzte Methoden können mit super weiter aufgerufen werden
Aufgabe 1 d) Beispiel Vererbung mit extends 1 class Vogel { 2 int alter; 3 void ruf() { 4 Std.out.println("mein alter ist " + alter); 5 } 6 } 7 8 class Ente extends Vogel { 9 // ersetzt ruf(), Zugriff auf Vogel.alter 10 void ruf() { 11 Std.out.println("quak " + alter); 12 } 13 }
Aufgabe 1 d) Fortsetzung Beispiel Verwendung von Ente und Vogel 1 Ente e = new Ente(); 2 // Zuweisung möglich, Ente auch vom Typ Vogel 3 Vogel v = e; 4 // Alter der Ente festlegen 5 e.alter = 42; 6 7 // Ausgabe: quak 42 8 // und nicht mein alter ist 42 9 e.ruf(); 10 11 // Fehler, nicht jeder Vogel ist eine Ente 12 Ente e2 = new Vogel();
Aufgabe 2 1 int a = 2, b = 5; 2 boolean g = false;
Aufgabe 2 1 int a = 2, b = 5; 2 boolean g = false; 3 4 // g = false ((1 * 5) == 5) 5 g = g (--a * b == b);
Aufgabe 2 1 int a = 2, b = 5; 2 boolean g = false; 3 4 // g = false ((1 * 5) == 5) 5 g = g (--a * b == b); 6 // geändert: g = true, a = 1
Aufgabe 2 1 int a = 2, b = 5; 2 boolean g = false; 3 4 // g = false ((1 * 5) == 5) 5 g = g (--a * b == b); 6 // geändert: g = true, a = 1 7 // if(true) b = 5 + (1 + 3) 8 if (g) b += a + 3;
Aufgabe 2 1 int a = 2, b = 5; 2 boolean g = false; 3 4 // g = false ((1 * 5) == 5) 5 g = g (--a * b == b); 6 // geändert: g = true, a = 1 7 // if(true) b = 5 + (1 + 3) 8 if (g) b += a + 3; 9 // geändert: b = 9
Aufgabe 2 1 int a = 2, b = 5; 2 boolean g = false; 3 4 // g = false ((1 * 5) == 5) 5 g = g (--a * b == b); 6 // geändert: g = true, a = 1 7 // if(true) b = 5 + (1 + 3) 8 if (g) b += a + 3; 9 // geändert: b = 9 10 11 a = b;
Aufgabe 2 1 int a = 2, b = 5; 2 boolean g = false; 3 4 // g = false ((1 * 5) == 5) 5 g = g (--a * b == b); 6 // geändert: g = true, a = 1 7 // if(true) b = 5 + (1 + 3) 8 if (g) b += a + 3; 9 // geändert: b = 9 10 11 a = b; 12 // geändert: a = 9 13 14 b = a;
Aufgabe 2 1 int a = 2, b = 5; 2 boolean g = false; 3 4 // g = false ((1 * 5) == 5) 5 g = g (--a * b == b); 6 // geändert: g = true, a = 1 7 // if(true) b = 5 + (1 + 3) 8 if (g) b += a + 3; 9 // geändert: b = 9 10 11 a = b; 12 // geändert: a = 9 13 14 b = a; 15 // da b bereits 9, keine Änderung mehr
Aufgabe 2 1 int a = 2, b = 5; 2 boolean g = false; 3 4 // g = false ((1 * 5) == 5) 5 g = g (--a * b == b); 6 // geändert: g = true, a = 1 7 // if(true) b = 5 + (1 + 3) 8 if (g) b += a + 3; 9 // geändert: b = 9 10 11 a = b; 12 // geändert: a = 9 13 14 b = a; 15 // da b bereits 9, keine Änderung mehr 16 // Ergebnis: a = 9, b = 9, g = true
Aufgabe 3 1 int [] vec = {1,2,3,4,5}; 2 for (int i = 3; i < 7; i++) { 3 if (i%2 == 0) continue; 4 vec[i - 2] *= vec[i - 3]; 5 } i i % 2 Anweisung vec[i - 2] *= vec[i - 3]
Aufgabe 3 1 int [] vec = {1,2,3,4,5}; 2 for (int i = 3; i < 7; i++) { 3 if (i%2 == 0) continue; 4 vec[i - 2] *= vec[i - 3]; 5 } i i % 2 Anweisung vec[i - 2] *= vec[i - 3] 3 1
Aufgabe 3 1 int [] vec = {1,2,3,4,5}; 2 for (int i = 3; i < 7; i++) { 3 if (i%2 == 0) continue; 4 vec[i - 2] *= vec[i - 3]; 5 } i i % 2 Anweisung vec[i - 2] *= vec[i - 3] 3 1 vec[1] = vec[1] * vec[0] //=2 Ergebnis:
Aufgabe 3 1 int [] vec = {1,2,3,4,5}; 2 for (int i = 3; i < 7; i++) { 3 if (i%2 == 0) continue; 4 vec[i - 2] *= vec[i - 3]; 5 } i i % 2 Anweisung vec[i - 2] *= vec[i - 3] 3 1 vec[1] = vec[1] * vec[0] //=2 Ergebnis: vec = {1,2,3,4,5}
Aufgabe 3 1 int [] vec = {1,2,3,4,5}; 2 for (int i = 3; i < 7; i++) { 3 if (i%2 == 0) continue; 4 vec[i - 2] *= vec[i - 3]; 5 } i i % 2 Anweisung vec[i - 2] *= vec[i - 3] 3 1 vec[1] = vec[1] * vec[0] //=2 Ergebnis: vec = {1,2,3,4,5} 4 0
Aufgabe 3 1 int [] vec = {1,2,3,4,5}; 2 for (int i = 3; i < 7; i++) { 3 if (i%2 == 0) continue; 4 vec[i - 2] *= vec[i - 3]; 5 } i i % 2 Anweisung vec[i - 2] *= vec[i - 3] 3 1 vec[1] = vec[1] * vec[0] //=2 Ergebnis: vec = {1,2,3,4,5} 4 0 Array unverändert
Aufgabe 3 1 int [] vec = {1,2,3,4,5}; 2 for (int i = 3; i < 7; i++) { 3 if (i%2 == 0) continue; 4 vec[i - 2] *= vec[i - 3]; 5 } i i % 2 Anweisung vec[i - 2] *= vec[i - 3] 3 1 vec[1] = vec[1] * vec[0] //=2 Ergebnis: vec = {1,2,3,4,5} 4 0 Array unverändert 5 1
Aufgabe 3 1 int [] vec = {1,2,3,4,5}; 2 for (int i = 3; i < 7; i++) { 3 if (i%2 == 0) continue; 4 vec[i - 2] *= vec[i - 3]; 5 } i i % 2 Anweisung vec[i - 2] *= vec[i - 3] 3 1 vec[1] = vec[1] * vec[0] //=2 Ergebnis: vec = {1,2,3,4,5} 4 0 Array unverändert 5 1 vec[3] = vec[3] * vec[2] //=12 Ergebnis:
Aufgabe 3 1 int [] vec = {1,2,3,4,5}; 2 for (int i = 3; i < 7; i++) { 3 if (i%2 == 0) continue; 4 vec[i - 2] *= vec[i - 3]; 5 } i i % 2 Anweisung vec[i - 2] *= vec[i - 3] 3 1 vec[1] = vec[1] * vec[0] //=2 Ergebnis: vec = {1,2,3,4,5} 4 0 Array unverändert 5 1 vec[3] = vec[3] * vec[2] //=12 Ergebnis: vec = {1,2,3,12,5}
Aufgabe 3 1 int [] vec = {1,2,3,4,5}; 2 for (int i = 3; i < 7; i++) { 3 if (i%2 == 0) continue; 4 vec[i - 2] *= vec[i - 3]; 5 } i i % 2 Anweisung vec[i - 2] *= vec[i - 3] 3 1 vec[1] = vec[1] * vec[0] //=2 Ergebnis: vec = {1,2,3,4,5} 4 0 Array unverändert 5 1 vec[3] = vec[3] * vec[2] //=12 Ergebnis: vec = {1,2,3,12,5} 6 0
Aufgabe 3 1 int [] vec = {1,2,3,4,5}; 2 for (int i = 3; i < 7; i++) { 3 if (i%2 == 0) continue; 4 vec[i - 2] *= vec[i - 3]; 5 } i i % 2 Anweisung vec[i - 2] *= vec[i - 3] 3 1 vec[1] = vec[1] * vec[0] //=2 Ergebnis: vec = {1,2,3,4,5} 4 0 Array unverändert 5 1 vec[3] = vec[3] * vec[2] //=12 Ergebnis: vec = {1,2,3,12,5} 6 0 Array unverändert Endergebnis: vec = {1,2,3,12,5}
Aufgabe 4 a) 1 public int quadrate() { 2 Std.out.print("Bitte...: n="); 3 int n = Std.in.readInt() 4 Std.out.print("Die... " n " Quadrat...: "); 5 for (i = 0; i < n; i++); 6 Std.out.print(i*i + " "); 7 }
Aufgabe 4 b) 1 public void quadrate() { 2 Std.out.print("Bitte...: n="); 3 int n = Std.in.readInt(); 4 Std.out.print("Die... "+n+" Quadrat...: "); 5 for (int i = 1; i <= n; i++) 6 Std.out.print(i*i + " "); 7 }
Aufgabe 5 a) For-Schleife for(int i = 1; i <= n; i++) {... } Äquivalente While-Schleife
Aufgabe 5 a) For-Schleife for(int i = 1; i <= n; i++) {... } Äquivalente While-Schleife
Aufgabe 5 a) For-Schleife for(int i = 1; i <= n; i++) {... } Äquivalente While-Schleife 1 void zahlen_while(int n) { 2 int i = 1; 3 while(i <= n) { 4 Std.out.println(i); 5 i++; 6 } 7 }
Aufgabe 5 b) Lösung 1 void zahlen_rek(int n) { 2 if(n > 0) { 3 zahlen_rek(n - 1); 4 Std.out.println(n); 5 } 6 } Beispiel, n = 3
Aufgabe 5 b) Lösung 1 void zahlen_rek(int n) { 2 if(n > 0) { 3 zahlen_rek(n - 1); 4 Std.out.println(n); 5 } 6 } Beispiel, n = 3 zahlen_rek(3)
Aufgabe 5 b) Lösung 1 void zahlen_rek(int n) { 2 if(n > 0) { 3 zahlen_rek(n - 1); 4 Std.out.println(n); 5 } 6 } Beispiel, n = 3 zahlen_rek(3) zahlen_rek(2)
Aufgabe 5 b) Lösung 1 void zahlen_rek(int n) { 2 if(n > 0) { 3 zahlen_rek(n - 1); 4 Std.out.println(n); 5 } 6 } Beispiel, n = 3 zahlen_rek(3) zahlen_rek(2) zahlen_rek(1)
Aufgabe 5 b) Lösung 1 void zahlen_rek(int n) { 2 if(n > 0) { 3 zahlen_rek(n - 1); 4 Std.out.println(n); 5 } 6 } Beispiel, n = 3 zahlen_rek(3) zahlen_rek(2) zahlen_rek(1) zahlen_rek(0) -- Abbruch
Aufgabe 5 b) Lösung 1 void zahlen_rek(int n) { 2 if(n > 0) { 3 zahlen_rek(n - 1); 4 Std.out.println(n); 5 } 6 } Beispiel, n = 3 zahlen_rek(3) zahlen_rek(2) zahlen_rek(1) -- println(1) zahlen_rek(0) -- Abbruch
Aufgabe 5 b) Lösung 1 void zahlen_rek(int n) { 2 if(n > 0) { 3 zahlen_rek(n - 1); 4 Std.out.println(n); 5 } 6 } Beispiel, n = 3 zahlen_rek(3) zahlen_rek(2) -- println(2) zahlen_rek(1) -- println(1) zahlen_rek(0) -- Abbruch
Aufgabe 5 b) Lösung 1 void zahlen_rek(int n) { 2 if(n > 0) { 3 zahlen_rek(n - 1); 4 Std.out.println(n); 5 } 6 } Beispiel, n = 3 zahlen_rek(3) -- println(3) zahlen_rek(2) -- println(2) zahlen_rek(1) -- println(1) zahlen_rek(0) -- Abbruch
Aufgabe 6 a) Fibonacci-Zahlen f 0 = 0, f 1 = 1, f n = f n 1 + f n 2
Aufgabe 6 a) Fibonacci-Zahlen f 0 = 0, f 1 = 1, f n = f n 1 + f n 2 Berechnung von f 6 n f n 0 0 1 1 2
Aufgabe 6 a) Fibonacci-Zahlen f 0 = 0, f 1 = 1, f n = f n 1 + f n 2 Berechnung von f 6 n f n 0 0 1 1 2 1 3
Aufgabe 6 a) Fibonacci-Zahlen f 0 = 0, f 1 = 1, f n = f n 1 + f n 2 Berechnung von f 6 n f n 0 0 1 1 2 1 3 2 4 3 5 5 6 8
Aufgabe 6 b) Fibonacci-Zahlen f 0 = 0, f 1 = 1, f n = f n 1 + f n 2 Rekursive Lösung 1 int fib_rek(int n) { 2 if(n == 0) 3 return 0; 4 if(n == 1) 5 return 1; 6 return fib rek(n-1) + fib rek(n-2); 7 }
Aufgabe 6 b) Fibonacci-Zahlen f 0 = 0, f 1 = 1, f n = f n 1 + f n 2 Rekursive Lösung 1 int fib_rek(int n) { 2 if(n == 0) 3 return 0; 4 if(n == 1) 5 return 1; 6 return fib rek(n-1) + fib rek(n-2); 7 }
Aufgabe 6 c) Iterative Lösung 1 int fib_it(int n) {
Aufgabe 6 c) Iterative Lösung 1 int fib_it(int n) { 2 int a = 0; // n - 2 3 int b = 1; // n - 1
Aufgabe 6 c) Iterative Lösung 1 int fib_it(int n) { 2 int a = 0; // n - 2 3 int b = 1; // n - 1 4 for(int i = 1; i <= n; i++) { 5 int t = b; // b zwischenspeichern 6 b = a + b; // f n+1 = f n + f n 1
Aufgabe 6 c) Iterative Lösung 1 int fib_it(int n) { 2 int a = 0; // n - 2 3 int b = 1; // n - 1 4 for(int i = 1; i <= n; i++) { 5 int t = b; // b zwischenspeichern 6 b = a + b; // f n+1 = f n + f n 1 7 a = t; 8 } 9 return a; 10 }
Aufgabe 7 Mögliches Verfahren Integer: direkter Zugriff auf Ziffern nicht möglich
Aufgabe 7 Mögliches Verfahren Integer: direkter Zugriff auf Ziffern nicht möglich letzte Ziffer einer Zahl?
Aufgabe 7 Mögliches Verfahren Integer: direkter Zugriff auf Ziffern nicht möglich letzte Ziffer einer Zahl? Rest von Divison durch 10, Beispiel: 42 : 10 = 4, Rest 2
Aufgabe 7 Mögliches Verfahren Integer: direkter Zugriff auf Ziffern nicht möglich letzte Ziffer einer Zahl? Rest von Divison durch 10, Beispiel: 42 : 10 = 4, Rest 2 in Java: int rest = 42 % 10 (Modulo-Operator)
Aufgabe 7 Mögliches Verfahren Integer: direkter Zugriff auf Ziffern nicht möglich letzte Ziffer einer Zahl? Rest von Divison durch 10, Beispiel: 42 : 10 = 4, Rest 2 in Java: int rest = 42 % 10 (Modulo-Operator) immer die zu addierende Ziffer zur letzten Stelle machen
Aufgabe 7 Mögliches Verfahren Integer: direkter Zugriff auf Ziffern nicht möglich letzte Ziffer einer Zahl? Rest von Divison durch 10, Beispiel: 42 : 10 = 4, Rest 2 in Java: int rest = 42 % 10 (Modulo-Operator) immer die zu addierende Ziffer zur letzten Stelle machen mittels ganzzahliger Division durch 1, 10, 100..., bis alle Stellen verrechnet
Aufgabe 7 Mögliches Verfahren Integer: direkter Zugriff auf Ziffern nicht möglich letzte Ziffer einer Zahl? Rest von Divison durch 10, Beispiel: 42 : 10 = 4, Rest 2 in Java: int rest = 42 % 10 (Modulo-Operator) immer die zu addierende Ziffer zur letzten Stelle machen mittels ganzzahliger Division durch 1, 10, 100..., bis alle Stellen verrechnet ist der Fall, wenn Division nur noch Null ergibt
Aufgabe 7 Mögliches Verfahren Integer: direkter Zugriff auf Ziffern nicht möglich letzte Ziffer einer Zahl? Rest von Divison durch 10, Beispiel: 42 : 10 = 4, Rest 2 in Java: int rest = 42 % 10 (Modulo-Operator) immer die zu addierende Ziffer zur letzten Stelle machen mittels ganzzahliger Division durch 1, 10, 100..., bis alle Stellen verrechnet ist der Fall, wenn Division nur noch Null ergibt Beispiel: Quersumme von a = 2634
Aufgabe 7 Mögliches Verfahren Integer: direkter Zugriff auf Ziffern nicht möglich letzte Ziffer einer Zahl? Rest von Divison durch 10, Beispiel: 42 : 10 = 4, Rest 2 in Java: int rest = 42 % 10 (Modulo-Operator) immer die zu addierende Ziffer zur letzten Stelle machen mittels ganzzahliger Division durch 1, 10, 100..., bis alle Stellen verrechnet ist der Fall, wenn Division nur noch Null ergibt Beispiel: Quersumme von a = 2634 a : 1 = 2634, 2634 % 10 = 4 Summe: 4
Aufgabe 7 Mögliches Verfahren Integer: direkter Zugriff auf Ziffern nicht möglich letzte Ziffer einer Zahl? Rest von Divison durch 10, Beispiel: 42 : 10 = 4, Rest 2 in Java: int rest = 42 % 10 (Modulo-Operator) immer die zu addierende Ziffer zur letzten Stelle machen mittels ganzzahliger Division durch 1, 10, 100..., bis alle Stellen verrechnet ist der Fall, wenn Division nur noch Null ergibt Beispiel: Quersumme von a = 2634 a : 10 = 263, 263 % 10 = 3 Summe: 4 + 3
Aufgabe 7 Mögliches Verfahren Integer: direkter Zugriff auf Ziffern nicht möglich letzte Ziffer einer Zahl? Rest von Divison durch 10, Beispiel: 42 : 10 = 4, Rest 2 in Java: int rest = 42 % 10 (Modulo-Operator) immer die zu addierende Ziffer zur letzten Stelle machen mittels ganzzahliger Division durch 1, 10, 100..., bis alle Stellen verrechnet ist der Fall, wenn Division nur noch Null ergibt Beispiel: Quersumme von a = 2634 a : 100 = 26, 26 % 10 = 6 Summe: 4 + 3 + 6
Aufgabe 7 Mögliches Verfahren Integer: direkter Zugriff auf Ziffern nicht möglich letzte Ziffer einer Zahl? Rest von Divison durch 10, Beispiel: 42 : 10 = 4, Rest 2 in Java: int rest = 42 % 10 (Modulo-Operator) immer die zu addierende Ziffer zur letzten Stelle machen mittels ganzzahliger Division durch 1, 10, 100..., bis alle Stellen verrechnet ist der Fall, wenn Division nur noch Null ergibt Beispiel: Quersumme von a = 2634 a : 1000 = 2, 2 % 10 = 2 Summe: 4 + 3 + 6 + 2
Aufgabe 7 Mögliches Verfahren Integer: direkter Zugriff auf Ziffern nicht möglich letzte Ziffer einer Zahl? Rest von Divison durch 10, Beispiel: 42 : 10 = 4, Rest 2 in Java: int rest = 42 % 10 (Modulo-Operator) immer die zu addierende Ziffer zur letzten Stelle machen mittels ganzzahliger Division durch 1, 10, 100..., bis alle Stellen verrechnet ist der Fall, wenn Division nur noch Null ergibt Beispiel: Quersumme von a = 2634 a : 10000 = 0, Abbruch Summe: 4 + 3 + 6 + 2 = 15
Aufgabe 7 Code 1 int quersumme(int n) {
Aufgabe 7 Code 1 int quersumme(int n) { 2 int sum = 0;
Aufgabe 7 Code 1 int quersumme(int n) { 2 int sum = 0; 3 while(n > 0) {
Aufgabe 7 Code 1 int quersumme(int n) { 2 int sum = 0; 3 while(n > 0) { 4 sum += n % 10;
Aufgabe 7 Code 1 int quersumme(int n) { 2 int sum = 0; 3 while(n > 0) { 4 sum += n % 10; 5 n /= 10; 6 }
Aufgabe 7 Code 1 int quersumme(int n) { 2 int sum = 0; 3 while(n > 0) { 4 sum += n % 10; 5 n /= 10; 6 } 7 return sum; 8 }
Aufgabe 8 a) Ausgabe: Erzeuge A- Objekt Erzeuge A- Objekt Erzeuge B- Objekt Erzeuge A- Objekt Erzeuge B- Objekt Erzeuge C- Objekt 2500-2 5
Aufgabe 8 a) Erläuterung I A a = new A(1); ruft Konstruktor von A auf, Ausgabe Erzeuge A- Objekt setzt Objektvariable x auf 1 Konstruktoren haben denselben Namen wie ihre Klasse und keinen Rückgabetyp (auch kein void!)
Aufgabe 8 a) Erläuterung I A a = new A(1); ruft Konstruktor von A auf, Ausgabe Erzeuge A- Objekt setzt Objektvariable x auf 1 Konstruktoren haben denselben Namen wie ihre Klasse und keinen Rückgabetyp (auch kein void!) B b = new B(0); ruft Konstruktor von B auf da B von A abgeleitet, wird durch super(x); zuerst Konstruktor von A aufgerufen Ausgabe: Erzeuge A- Objekt Erzeuge B- Objekt
Aufgabe 8 a) Erläuterung II C c = new C(5); ruft Konstruktor von C auf da C von B, und B von A abgeleitet, werden analog die Konstruktoren A, B, C nacheinander aufgerufen Verkettung über beliebig viele Vererbungsstufen möglich Ausgabe: Erzeuge A- Objekt Erzeuge B- Objekt Erzeuge C- Objekt
Aufgabe 8 a) Erläuterung III b.foo(50); B definiert keine Methode foo(int x) daher wurde A.foo vererbt und wird jetzt ausgeführt: zwei verschachtelte For-Schleifen, jeweils n mal Methode berechnet daher effektiv x = x + n*n Ausgabe: 2500
Aufgabe 8 a) Erläuterung IV c.foo(50); foo(int x) wurde in Klasse C neu definiert zählt Objektvariable x so lange runter, bis x-- < 0 Post-Decrement: gibt erst aktuellen Wert zurück und zählt dann runter (bei --x genau umgekehrt) -1 erster Wert, der Bedingung nicht mehr erfüllt danach wird noch einmal runtergezählt: x hat nach Schleife den Wert -2 Ausgabe: -2
Aufgabe 8 a) Erläuterung V 1 public static void increment(int y) { 2 y++; 3 } 4 int y = 5; 5 increment(y); b.increment(y);
Aufgabe 8 a) Erläuterung V 1 public static void increment(int y) { 2 y++; 3 } 4 int y = 5; 5 increment(y); b.increment(y); zählt die lokale Variable y innerhalb der Methode foo() hoch beide Variablen heißen gleich, existieren aber getrennt voneinander Änderung wirkt sich nicht auf das y in TestABC.main aus! einzige Verbindung: beim Aufruf wird der Wert von main-y nach foo-y kopiert Ausgabe: 5
Aufgabe 8 b) B.increment greift nicht auf nicht-statische Methoden oder Variablen ihrer Klasse zu kann daher als einzige Methode statisch deklariert werden
Aufgabe 8 b) B.increment greift nicht auf nicht-statische Methoden oder Variablen ihrer Klasse zu kann daher als einzige Methode statisch deklariert werden Achtung: Zugriffe auf nicht-statische Teile der Klasse, die sich auf ein Objekt beziehen, sind erlaubt:
Aufgabe 8 b) Beispiel B.increment greift nicht auf nicht-statische Methoden oder Variablen ihrer Klasse zu kann daher als einzige Methode statisch deklariert werden Achtung: Zugriffe auf nicht-statische Teile der Klasse, die sich auf ein Objekt beziehen, sind erlaubt: 1 class X { 2 int k; 3 static void f() { 4 // nicht erlaubt: k = 42; 5 // aber: 6 X x = new X(); 7 x.k = 42; 8 } 9 }
Aufgabe 8 b) statisch vs. nicht-statisch I
Aufgabe 8 b) statisch vs. nicht-statisch I nicht-statische Methoden (und Variablen) gehören zu einem Objekt
Aufgabe 8 b) statisch vs. nicht-statisch I nicht-statische Methoden (und Variablen) gehören zu einem Objekt können nur mit einem Objekt verwendet werden
Aufgabe 8 b) statisch vs. nicht-statisch I nicht-statische Methoden (und Variablen) gehören zu einem Objekt können nur mit einem Objekt verwendet werden Achtung: in nicht-statischen Methoden existiert immer ein Objekt, this
Aufgabe 8 b) statisch vs. nicht-statisch I nicht-statische Methoden (und Variablen) gehören zu einem Objekt können nur mit einem Objekt verwendet werden Achtung: in nicht-statischen Methoden existiert immer ein Objekt, this statische Methoden und Variablen sind lediglich Klassengebunden
Aufgabe 8 b) statisch vs. nicht-statisch I nicht-statische Methoden (und Variablen) gehören zu einem Objekt können nur mit einem Objekt verwendet werden Achtung: in nicht-statischen Methoden existiert immer ein Objekt, this statische Methoden und Variablen sind lediglich Klassengebunden existieren automatisch genau einmal pro Klasse
Aufgabe 8 b) statisch vs. nicht-statisch I nicht-statische Methoden (und Variablen) gehören zu einem Objekt können nur mit einem Objekt verwendet werden Achtung: in nicht-statischen Methoden existiert immer ein Objekt, this statische Methoden und Variablen sind lediglich Klassengebunden existieren automatisch genau einmal pro Klasse sind ohne Objekt benutzbar
Aufgabe 8 b) statisch vs. nicht-statisch II Beispiel 1 // f() statisch; wird an der Klasse aufgerufen 2 X.f();
Aufgabe 8 b) statisch vs. nicht-statisch II Beispiel 1 // f() statisch; wird an der Klasse aufgerufen 2 X.f(); 3 4 // k ist nicht statisch 5 X y = new X(); 6 //... 7 y.k = 73;
Aufgabe 8 b) statisch vs. nicht-statisch II Beispiel 1 // f() statisch; wird an der Klasse aufgerufen 2 X.f(); 3 4 // k ist nicht statisch 5 X y = new X(); 6 //... 7 y.k = 73; 8 9 // auch zulässig, aber zu vermeiden 10 y.f();
Aufgabe 8 b) this this ist immer das aktuelle Objekt
Aufgabe 8 b) this Beispiel this ist immer das aktuelle Objekt 1 class X { 2 //... 3 void g() { 4 this.k = 23; 5 // oder, wenn k nicht auch lokal 6 // innerhalb von g() definiert: 7 k = 23; 8 } 9 }
Aufgabe 8 b) this Beispiel this ist immer das aktuelle Objekt 1 class X { 2 //... 3 void g() { 4 this.k = 23; 5 // oder, wenn k nicht auch lokal 6 // innerhalb von g() definiert: 7 k = 23; 8 } 9 } 10 X x1 = new X(), x2 = new X();
Aufgabe 8 b) this Beispiel this ist immer das aktuelle Objekt 1 class X { 2 //... 3 void g() { 4 this.k = 23; 5 // oder, wenn k nicht auch lokal 6 // innerhalb von g() definiert: 7 k = 23; 8 } 9 } 10 X x1 = new X(), x2 = new X(); 11 x1.g(); // this ist hier x1
Aufgabe 8 b) this Beispiel this ist immer das aktuelle Objekt 1 class X { 2 //... 3 void g() { 4 this.k = 23; 5 // oder, wenn k nicht auch lokal 6 // innerhalb von g() definiert: 7 k = 23; 8 } 9 } 10 X x1 = new X(), x2 = new X(); 11 x1.g(); // this ist hier x1 12 x2.g(); // hier this = x2
Aufgabe 9 I 1 public double area() { 2 return Math.PI * r * r; 3 } 4 5 public double perimeter() { 6 return 2 * Math.PI * r; 7 } 8 9 public double diameter() { 10 return 2 * r; 11 }
Aufgabe 9 II 1 public boolean overlap(circle that) { 2 return Math.sqrt ( 3 (this.x - that.x) * (this.x - that.x) 4 + (this.y - that.y) * (this.y - that.y) 5 ) <= this.r + that.r; 6 } 7 8 public double distance(circle that) { 9 if (overlap(that)) 10 return 0; 11 return Math.sqrt ( 12 (this.x - that.x) * (this.x - that.x) 13 + (this.y - that.y) * (this.y - that.y) 14 ) - this.r - that.r; 15 }
Aufgabe 9 III 1 public void draw(turtle t) { 2 double b = 2*r * Math.sin(Math.PI / 2 / 180); 3 t.setposition(x, y); 4 t.lt(90); 5 t.fd(r); 6 t.rt(90); 7 t.pd(); 8 for (int i = 0; i < 360; i++) { 9 t.rt(1); 10 t.fd(b); 11 } 12 t.pu(); 13 }
Aufgabe 10 1 private Color c; 2 // Konstruktor 3 public ColoredCircle(double x, double y, 4 double r, Color c) { 5 // Wichtig: Oberklassen-Konstruktor vor 6 // allem anderen aufrufen, sonst Fehler 7 super(x, y, r); 8 // Farbe speichern 9 this.c = c; 10 } 11 // Methode aus Oberklasse überschreiben 12 public void draw(turtle t) { 13 t.setpencolor(c); 14 // überschriebene Methode aufrufen 15 super.draw(t); 16 }
Fragen bis hierhin?