Warum hat deine Variable nach dem Methodenaufruf noch denselben Wert, obwohl die Methode sie doch um zehn erhöht hat?
Dein Fortschritt:
0 / 0 Aufgaben
1
Übungsaufgaben
Zehn Übungen zum Klicken, Ziehen und Knobeln — von AFB I bis AFB III. Jede Übung gibt dir sofort Rückmeldung; wenn du hängst, helfen dir die gestuften Tipps.
A1
Was Methoden können
AFB I
Welche Aussagen über Methoden in Java stimmen?
Mehrere Antworten sind richtig. Markiere alle zutreffenden und klicke dann auf „Prüfen“.
Eine Methode ist nur ein benannter Block — sie läuft erst, wenn sie aufgerufen wird (z. B. aus main). Der Rückgabetyp im Kopf ist ein Versprechen: Bei int muss eine ganze Zahl zurückkommen, bei void nichts. Und anders als in Python steht vor jedem Parameter sein Typ, z. B. int alter.
Ansatz: Denk an den Kopf public static int verdoppeln(int x): Was verrät jedes Wort?
Weiter: Java prüft Typen streng — auch bei Parametern und Rückgabewerten.
A2
Stimmt's? — Aufruf und Rückgabe
AFB I
Fünf Behauptungen rund um Parameter, Argumente und return.
Fünf Aussagen nacheinander. Eine falsche Einschätzung reicht — dann startest du die Serie mit „Neue Runde“ neu.
Aussage 1 von 5
Merksatz: Parameter stehen im Kopf der Methode (mit Typ), Argumente beim Aufruf (nur Werte). Beim Aufruf wird der Wert des Arguments in den Parameter kopiert — die Namen müssen nicht übereinstimmen.
Ansatz: Lies einen Methodenkopf von links nach rechts: Rückgabetyp, Name, Parameterliste.
Weiter: Was könnte man in einer Variable speichern, wenn die Methode gar nichts zurückgibt?
A3
Kopf und Aufruf
AFB I
Verbinde jeden Methodenkopf (ohne public abgekürzt) mit dem Aufruf, der dazu passt.
Klicke links einen Eintrag an und dann rechts den passenden — es entsteht eine Verbindungslinie. Mit der Tastatur: Enter zum Auswählen, ↑/↓ zum Wandern.
Zwei Dinge müssen passen: Die Argumente (Anzahl, Reihenfolge, Typ) zur Parameterliste — und der Typ der Variable links zum Rückgabetyp. Eine void-Methode ruft man einfach als eigene Anweisung auf. Die Köpfe sind hier ohne public abgekürzt; im Programm steht public static.
Ansatz: Vergleiche zuerst den Rückgabetyp mit dem Typ der Variable, in die das Ergebnis kommt.
Weiter: wiederhole braucht einen Text und eine Zahl — in genau dieser Reihenfolge.
A4
Rabatt im Sneaker-Shop
AFB II
Die Methode soll den Preis nach Abzug eines Rabatts in Prozent liefern. In main wird sie für Sneaker zu 40 € mit 25 % Rabatt benutzt. Zwei Bausteine bleiben übrig.
Wort anklicken, dann Lücke anklicken (oder umgekehrt) — mit Tab und Enter geht es genauso. Ein Klick auf eine gefüllte Lücke legt das Wort zurück.
publicrabatt(double preis,prozent) { preis * (100 - prozent) / 100; } // in main: double neu =(40.0, 25);
neu erhält 30.0. void passt nicht, weil die Methode einen Preis zurückgeben soll — und print wäre der häufigste Denkfehler: Eine Ausgabe auf dem Bildschirm ist etwas anderes als eine Rückgabe. Mit print könnte main mit dem Ergebnis nicht weiterrechnen.
Ansatz: Welchen Typ hat ein Preis mit Cent? Welcher Typ passt zu „25 Prozent“?
Weiter: Das Ergebnis soll in der Variable neu landen. Welches Wort schickt es dorthin zurück?
A5
Scorerpunkte im Fußball
AFB II
Eine Vereins-App berechnet Scorerpunkte: Ein Tor zählt doppelt, eine Vorlage einfach.
public static int punkte(int tore, int vorlagen) {
return 2 * tore + vorlagen;
}
// in main:
int a = punkte(3, 1);
int b = punkte(a, 2);
System.out.println(punkte(b - a, 0));
Welche Zahl wird ausgegeben?
Rechne selbst und trage das Ergebnis ein — Enter prüft direkt.
a = 2 · 3 + 1 = 7. Beim zweiten Aufruf wird der Wert von a in den Parameter tore kopiert: b = 2 · 7 + 2 = 16. Das Argument darf auch eine Rechnung sein: b − a = 9, also 2 · 9 + 0 = 18. Wer die Parameter vertauscht, erhält andere Werte — die Reihenfolge der Argumente entscheidet.
Ansatz: Rechne Zeile für Zeile. Schreibe bei jedem Aufruf auf, welcher Wert in tore und welcher in vorlagen landet.
Weiter: a = 7. Beim letzten Aufruf wird erst b − a ausgerechnet, dann die Methode aufgerufen.
A6
Welche Aufrufe übersetzt javac?
AFB II
Eine Zimmerplaner-App hat diese beiden Methoden:
public static int flaeche(int breite, int hoehe) { … }
public static void zeigeMenue() { … }
Ziehe jede Karte in den passenden Korb — oder wähle sie mit Enter aus und drücke dann die Ziffer des Korbs (0 legt sie zurück).
1wird übersetzt
2Übersetzungsfehler
Überraschend für viele: flaeche(2, 2); wird übersetzt — man darf einen Rückgabewert ignorieren, er ist dann eben verloren. Die Fehler: void kann man nicht speichern; ein Argument zu wenig („cannot be applied to given types“); 2.5 passt nicht in einen int-Parameter; und eine Zahl ist kein String.
Ansatz: Prüfe bei jedem Aufruf: Stimmen Anzahl und Typen der Argumente?
Weiter: Prüfe dann: Passt der Rückgabetyp zur Variable links? Und muss man ein Ergebnis überhaupt speichern?
A7
Wer ruft wen?
AFB II
Ein Spiel berechnet einen Bonus. Bring die Ereignisse in die Reihenfolge, in der sie beim Ausführen passieren.
public static void main(String[] args) {
System.out.println("Start");
int e = bonus(4);
System.out.println("Ergebnis " + e);
}
public static int bonus(int n) {
int d = verdopple(n);
return n * d;
}
public static int verdopple(int x) {
return 2 * x;
}
Ziehe die Karten in die richtige Reihenfolge — mit der Tastatur: ↑/↓ verschiebt, Shift+↑/↓ wechselt nur den Fokus.
1main gibt „Start“ aus
2main ruft bonus(4) auf — n bekommt den Wert 4
3bonus ruft verdopple(4) auf
4verdopple gibt 8 zurück
5bonus gibt 4 · 8 = 32 zurück
6main gibt „Ergebnis 32“ aus
Die Reihenfolge im Quelltext (main, bonus, verdopple) ist nicht die Reihenfolge der Ausführung — es zählt, wer wen wann aufruft. Ein Aufruf „pausiert“ die aufrufende Methode, bis die aufgerufene mit return zurückkehrt. Deshalb kommt die Rückgabe von verdopple vor der von bonus.
Ansatz: Ein Java-Programm startet immer in main. Folge von dort jedem Aufruf mit dem Finger.
Weiter: bonus kann erst etwas zurückgeben, wenn es den Wert d von verdopple kennt.
A8
Der Notenschnitt-Rechner
AFB III
Das Programm soll den genauen Durchschnitt der Noten 2, 3 und 2 ausgeben (2.333…). Drei Zeilen sind falsch: Sie lassen sich nicht übersetzen oder liefern ein falsches Ergebnis.
Klicke die fehlerhaften Zeilen an und tippe darunter jeweils die ganze korrigierte Zeile ein. „Prüfen“ kontrolliert erst deine Auswahl, dann die Korrekturen.
Korrektur:
Korrektur:
Korrektur:
Korrektur:
Korrektur:
Korrektur:
Korrektur:
Korrektur:
Zeile 2: Semikolon fehlt. Zeile 6: Die Methode verlangt drei Argumente — mit zweien meldet javac „cannot be applied to given types“. Zeile 3 ist die gemeine: Sie wird übersetzt, liefert aber 2.0, weil summe / 3 eine Ganzzahldivision ist. Der Rückgabetyp double ändert daran nichts — erst 3.0 erzwingt eine Kommazahl-Division (Ergebnis 2.3333333333333335).
Ansatz: Zwei Fehler findet javac: einen am Zeilenende, einen beim Vergleich von Methodenkopf und Aufruf.
Weiter: Den dritten findet nur, wer rechnet: Welchen Typ haben summe und 3? Was ergibt dann 7 / 3?
A9
Vielfache zählen
AFB IIIMix
Die Methode verbindet Schleife und Verzweigung aus 1.1.3: Sie zählt, wie viele Zahlen von 1 bis grenze durch teiler teilbar sind.
public static int zaehleVielfache(int grenze, int teiler) {
int anzahl = 0;
for (int i = 1; i <= grenze; i++) {
if (i % teiler == 0) {
anzahl++;
}
}
return anzahl;
}
Rechne die Kette Schritt für Schritt: Erst wenn ein Schritt stimmt, wird der nächste freigeschaltet. Enter prüft.
zaehleVielfache(20, 3)
zaehleVielfache(20, 5) + zaehleVielfache(9, 10)
zaehleVielfache(zaehleVielfache(30, 2), 4)
Transfer: Welches ist die kleinste grenze, für die zaehleVielfache(grenze, 7) den Wert 3 liefert?
3, 6, 9, 12, 15, 18 → 6. Durch 5: 5, 10, 15, 20 → 4; bis 9 gibt es kein Vielfaches von 10 → 0. Verschachtelt wird von innen nach außen gerechnet: Bis 30 gibt es 15 gerade Zahlen, dann zaehleVielfache(15, 4): 4, 8, 12 → 3. Transfer: Das dritte Vielfache von 7 ist 21 — ab dort ist das Ergebnis 3 (bis 27).
Ansatz: Die Methode zählt die Vielfachen von teiler, die nicht größer als grenze sind. Schreibe sie einfach auf.
Weiter: Beim verschachtelten Aufruf wird zuerst der innere ausgerechnet — sein Ergebnis ist die grenze des äußeren.
A10
Trick: Der Bonus
AFB IIITrick
Zwei Methoden sollen einem Spieler 10 Bonuspunkte geben:
public static void erhoehe(int punkte) {
punkte = punkte + 10;
}
public static int mitBonus(int punkte) {
punkte = punkte + 10;
return punkte;
}
Was gibt jedes der drei Programmstücke in main aus?
Wähle in jedem Menü die passende Ausgabe und klicke dann auf „Prüfen“.
Programmstück
Ausgabe
int punkte = 5; erhoehe(punkte); System.out.println(punkte);
int p = 5; p = mitBonus(p); System.out.println(p);
int q = 5; mitBonus(q); System.out.println(q);
Beim Aufruf wird nur der Wert 5 in den Parameter kopiert. Der Parameter punkte ist eine eigene, lokale Variable der Methode — auch wenn er genauso heißt wie die Variable in main. Ändert die Methode ihn, bleibt die Variable in main unberührt: 5. Nur im zweiten Stück wird das Ergebnis mit return zurückgegeben und in main wieder gespeichert: 15. Im dritten Stück geht der Rückgabewert verloren, weil ihn niemand auffängt: wieder 5.
Ansatz: Die Methode bekommt eine Kopie des Werts, nicht die Variable selbst. Wie kommt eine Änderung dann nach main zurück?
Weiter: Nur return plus eine Zuweisung in main (p = …) ändert die Variable in main.