MINT üben

Primitive Typen und Referenzen

Dreißig Übungen zu Referenzen, Alias, null und Vergleichen — von AFB I bis AFB III.

Dein Fortschritt:
0 / 0 Aufgaben
1

Übungsaufgaben

Dreißig Übungen in gemischter Reihenfolge — du klickst, ziehst, ordnest, rechnest und knobelst. Jede Übung gibt dir sofort eine Rückmeldung, und zu jeder Aufgabe gibt es zwei gestufte Tipps: Der erste zeigt die Richtung, der zweite den entscheidenden Schritt. Die Chips zeigen das Anforderungsniveau: AFB I heißt wiedergeben und direkt anwenden, AFB II selbst entscheiden und verknüpfen, AFB III begründen, beurteilen oder eine Falle durchschauen. Aufgaben mit dem Chip Mix verbinden Wissen aus früheren Unterkapiteln, bei Trick steckt eine Falle drin. Fährst du über ein unterstrichenes Arbeitswort, siehst du, was es genau von dir verlangt.

A1
Das passende Speicherbild
AFB I

Die Heizungssteuerung eines Hauses führt diese Zeilen aus. Ein Ofen regelt einen Raum. Die Klasse Ofen hat den Konstruktor Ofen(soll: Ganzzahl) und die Methode setSoll(wert).

Ofen o1 = new Ofen(20);
Ofen o2 = o1;
o2.setSoll(24);

Nenne das Speicherbild, das nach diesen drei Zeilen stimmt.

Klicke die passende Karte an und prüfe dann. Mit der Tastatur: Tab zur Karte, Enter auswählen.
Es gibt nur ein Objekt: o2 = o1 kopiert die Referenz, kein zweiter Ofen entsteht. setSoll verändert genau dieses Objekt, also steht dort soll = 24, und beide Variablen zeigen darauf. Bei A wäre ein zweites Objekt entstanden, bei B hätte setSoll nichts bewirkt, und bei D würden die Variablen den Wert selbst enthalten, wie bei int.
Zähle die Wörter new in den drei Zeilen: So viele Objekte gibt es.
Die zweite Zeile kopiert nur die Referenz. Die dritte Zeile ändert das Objekt, auf das beide Variablen zeigen.
A2
Omas Sparschwein
AFB III

Oma hilft beim Sparen. Jede Zeile unten startet neu mit Sparschwein p = new Sparschwein(); int bar = 1; Oma o = new Oma(); Zeige für jede Zeile, welchen Wert der letzte Ausdruck liefert. Achte genau darauf, was in den Methoden mit dem Parameter passiert.

public class Sparschwein {
    private int betrag;

    public Sparschwein() {
        betrag = 0;
    }

    public void einwerfen(int euro) {
        betrag = betrag + euro;
    }

    public int getBetrag() {
        return betrag;
    }
}
public class Oma {
    public void schenken(Sparschwein s) {
        s.einwerfen(1);
    }

    public void neuesSchwein(Sparschwein s) {
        s = new Sparschwein();
        s.einwerfen(3);
    }

    public void erhoehen(int zahl) {
        zahl = zahl + 2;
    }
}
Wähle für jede Zeile eine Stufe: 0 = Wert 0, 1 = Wert 1, 2 = Wert 2, 3 = Wert 3, 4 = Wert 4. Mit der Tastatur: Tab zur Zeile, ←/→ zwischen den Stufen, Enter setzt.
0 = Wert 04 = Wert 4
o.schenken(p); p.getBetrag()
o.neuesSchwein(p); p.getBetrag()
o.erhoehen(bar); bar
Sparschwein q = p; o.schenken(q); o.schenken(p); p.getBetrag()
p.einwerfen(4); o.neuesSchwein(p); p.getBetrag()
Der Parameter s bekommt eine Kopie der Referenz. Über diese Kopie kann schenken das gemeinsame Objekt verändern. neuesSchwein biegt dagegen nur seine lokale Kopie auf ein neues Schwein um — p merkt davon nichts, die 3 Euro landen in einem Objekt, das nach der Methode niemand mehr kennt. Genauso ändert erhoehen nur seine Kopie von bar. Wer 3, 3 und 7 erwartet hat, hat „Parameter ändern“ mit „Objekt ändern“ verwechselt.
Ansatz: Frage bei jeder Methode: Wird das übergebene Objekt verändert (Methodenaufruf an s) oder nur der Parameter neu belegt (s = new Sparschwein())?
Weiter: Eine Zuweisung an einen Parameter wirkt nie nach außen. Ein Methodenaufruf über den Parameter wirkt auf das Objekt, das auch der Aufrufer kennt.
A3
Zeile für Zeile bei den Drohnen
AFB II

Die Steuerung einer Drohnenflotte führt diese sechs Zeilen aus. Die Methode fliegen(minuten) verbraucht Akku, Drohne(akku) legt eine Drohne mit vollem Akku an. Erkläre den Ablauf, indem du zu jeder Frage die passende Zeile anklickst.

Klicke die gesuchte Stelle an. Mit der Tastatur: Tab oder Pfeiltasten zum Wandern, Enter zum Auswählen.

1Drohne d1 = new Drohne(80);2Drohne d2 = d1;3Drohne d3 = new Drohne(80);4d2.fliegen(30);5Drohne d4 = null;6d4 = d3;
Zeile 2 kopiert nur die Referenz (Alias). Das zweite Objekt entsteht in Zeile 3 durch new. In Zeile 4 wirkt fliegen über d2 auf das Objekt, das auch d1 meint. In Zeile 5 hat d4 den Wert null; erst Zeile 6 lässt d4 auf das Objekt von d3 zeigen.
Frage dich bei jeder Zeile: Entsteht hier ein Objekt (new), wird nur eine Referenz kopiert, oder wird ein Objekt verändert?
Ein Alias entsteht durch Variable = andere Variable ohne new. Über einen Alias ändert man dasselbe Objekt wie über das Original.