Trinkflaschen in der großen Pause
AFB I–IIEine Trink-App erinnert Schülerinnen und Schüler daran, genug zu trinken. Jede Trinkflasche gehört einer Person, hat ein Volumen und einen aktuellen Inhalt in Millilitern. Eine neue Flasche ist voll. Lena und Jan benutzen die App in der großen Pause (Material 2).
public class Trinkflasche {
private String besitzer;
private int inhalt; // in ml
private int volumen; // in ml
public Trinkflasche(String besitzer, int volumen) {
this.besitzer = besitzer;
this.volumen = volumen;
this.inhalt = volumen;
}
public void trinken(int ml) {
inhalt = inhalt - ml;
if (inhalt < 0) {
inhalt = 0;
}
}
public void auffuellen() {
inhalt = volumen;
}
public void anzeigen() {
System.out.println(besitzer + ": " + inhalt + " von " + volumen + " ml");
}
}
Trinkflasche lena = new Trinkflasche("Lena", 750);
Trinkflasche jan = new Trinkflasche("Jan", 500);
lena.trinken(200);
jan.trinken(350);
lena.trinken(100);
jan.auffuellen();
jan.trinken(600);
lena.anzeigen();
jan.anzeigen();
- Ordne den Begriffen Klasse, Objekt, Attribut, Konstruktor und Methode je ein passendes Beispiel aus Material 1 und 2 zu.
- Gib die Objektkarten beider Flaschen nach dem Ablauf von Material 2 und die Ausgabe an.
- Erläutere am Beispiel von
jan.trinken(350);, warum dieser Aufruf Lenas Flasche nicht verändert, obwohl beide Flaschen dieselbe Methode benutzen.
Hinweise
Hinweis zu Aufgabe a)
class, die Exemplare entstehen mit new. Der Konstruktor heißt wie die Klasse.Hinweis zu Aufgabe b)
if-Abfrage in trinken.Hinweis zu Aufgabe c)
inhalt gibt es im Speicher?Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
| Begriff | Beispiel |
|---|---|
| Klasse | Trinkflasche – der Bauplan |
| Objekt | die Flasche, auf die lena verweist (ebenso jan) |
| Attribut | inhalt (ebenso besitzer, volumen) |
| Konstruktor | Trinkflasche(String besitzer, int volumen), aufgerufen mit new |
| Methode | trinken(int ml) (ebenso auffuellen, anzeigen) |
Erwartungshorizont zu Aufgabe b)
- besitzer = "Lena"
- inhalt = 450
- volumen = 750
- besitzer = "Jan"
- inhalt = 0
- volumen = 500
Lena: 750 − 200 − 100 = 450. Jan: 500 − 350 = 150, auffüllen auf 500, dann 500 − 600 = −100, die if-Abfrage setzt den Inhalt auf 0.
Lena: 450 von 750 ml Jan: 0 von 500 ml
Erwartungshorizont zu Aufgabe c)
Die Klasse ist nur der Bauplan. Jedes mit new erzeugte Objekt hat seine eigenen Attributwerte – es gibt zwei getrennte Attribute inhalt, eins in Lenas und eins in Jans Flasche. Beim Aufruf jan.trinken(350) bestimmt die Variable vor dem Punkt, an welchem Objekt die Methode arbeitet: inhalt meint dann den Inhalt von Jans Flasche. Lenas Objekt wird gar nicht angesprochen.
Rundenzähler beim Sponsorenlauf
AFB II–IIIBeim Sponsorenlauf der Schule zahlen Sponsoren für jede gelaufene Runde. Die SV möchte die Runden mit einem Java-Programm zählen. Eine Klasse Laeufer soll den Namen, die Startnummer und die Anzahl der Runden speichern. Beim Erzeugen werden Name und Startnummer übergeben, die Rundenzahl beginnt bei 0. Die Methode rundeGeschafft() erhöht die Rundenzahl um 1, ausgeben() schreibt z. B. 12 Ida: 2 Runden auf die Konsole.
Tim hält die Klasse für übertrieben: „Bei 120 Läufern lege ich einfach Variablen name1, runden1, name2, runden2 … an.“
Laeufer ida = new Laeufer("Ida", 12);
Laeufer ole = Laeufer("Ole", 7);
Laeufer finn = new Laeufer(31, "Finn");
Laeufer kim = new Laeufer("Kim", 20);
Laeufer k = kim;
ida.rundeGeschafft();
kim.rundeGeschafft();
k.rundeGeschafft();
ida.rundeGeschafft();
kim.rundeGeschafft();
ida.ausgeben();
kim.ausgeben();
k.ausgeben();
- Implementiere die Klasse
Laeufernach der Beschreibung. - Analysiere das Material: Welche zwei Zeilen übersetzt
javacnicht, und warum? Welche Ausgabe entsteht, wenn man diese beiden Zeilen löscht? - Bewerte Tims Vorschlag im Vergleich zur Klasse
Laeufer.
Hinweise
Hinweis zu Aufgabe a)
this), zwei Methoden ohne Rückgabe.Hinweis zu Aufgabe b)
new davor? Passt die Reihenfolge der Argumente zum Konstruktor? Und: Wie viele Objekte entstehen in Zeile 4 und 5 wirklich?„Analysieren“ heißt: die entscheidenden Stellen gezielt herausarbeiten.Hinweis zu Aufgabe c)
Erwartungshorizont
Erwartungshorizont zu Aufgabe a)
public class Laeufer {
private String name;
private int startnummer;
private int runden;
public Laeufer(String name, int startnummer) {
this.name = name;
this.startnummer = startnummer;
this.runden = 0;
}
public void rundeGeschafft() {
runden = runden + 1;
}
public void ausgeben() {
System.out.println(startnummer + " " + name + ": " + runden + " Runden");
}
}
this.runden = 0; darf fehlen, weil int-Attribute ohnehin mit 0 starten.
Erwartungshorizont zu Aufgabe b)
Zeile 2: new fehlt. Ohne new sucht Java eine Methode Laeufer(String, int) und findet keine (cannot find symbol).
Zeile 3: Die Argumente sind vertauscht. Der Konstruktor erwartet zuerst einen String, bekommt aber 31 (incompatible types: int cannot be converted to String).
Ausgabe ohne diese Zeilen:
12 Ida: 2 Runden 20 Kim: 3 Runden 20 Kim: 3 Runden
Laeufer k = kim; erzeugt kein neues Objekt: k und kim verweisen auf dasselbe Objekt. Alle drei Aufrufe über kim bzw. k erhöhen also dieselbe Rundenzahl.
Erwartungshorizont zu Aufgabe c)
Tims Vorschlag: Er funktioniert ohne neue Konzepte, erfordert bei 120 Läufern aber 360 Variablen und für jede Runde eigenen Code. Name und Runden gehören nur über die Nummer im Variablennamen zusammen – Verwechslungen wie runden17 = runden71 + 1 fallen niemandem auf. Soll zusätzlich die Klasse gespeichert werden, braucht es 120 weitere Variablen.
Klasse: Alles, was zu einem Läufer gehört, steckt in einem Objekt. Die Methoden gibt es nur einmal, jedes Objekt nutzt sie. Eine Erweiterung ändert nur den Bauplan.
Urteil: Die Klasse ist deutlich übersichtlicher, sicherer und leichter erweiterbar; Tims Vorschlag taugt höchstens für zwei oder drei Läufer. Ein begründetes Urteil anhand mehrerer Kriterien ist vollständig.
