Informatik

Rückblick

Dieses Kapitel erklärt, was in den vorigen immer schon passiert ist, ohne dass es jemand gesagt hätte: dass Objektvariablen Verweise enthalten. Wer das verstanden hat, versteht auch die verketteten Strukturen der nächsten Kapitel – dort besteht alles aus Verweisen.

Das kann ich jetzt

  • Ich kann zweidimensionale Felder anlegen, füllen und in verschachtelten Schleifen durchlaufen. (2.1)
  • Ich kann erklären, was bei einem Methodenaufruf mit elementaren Typen und was mit Objekttypen geschieht. (2.2)
  • Ich kann Aliasing erkennen und die Folgen benennen. (2.2)
  • Ich kann eine flache von einer tiefen Kopie unterscheiden. (2.2)
  • Ich kann eine generische Klasse schreiben und begründen, was sie gegenüber Object gewinnt. (2.3)

Gemischte Aufgaben

Aufgabe 1: Wer zeigt worauf?

void main() {
    int a = 5;
    int b = a;
    b = 99;
    IO.println("a = " + a);
 
    int[] feld1 = {1, 2, 3};
    int[] feld2 = feld1;
    feld2[0] = 99;
    IO.println("feld1[0] = " + feld1[0]);
 
    int[] feld3 = {1, 2, 3};
    int[] feld4 = new int[3];
    for (int i = 0; i < feld3.length; i++) {
        feld4[i] = feld3[i];
    }
    feld4[0] = 99;
    IO.println("feld3[0] = " + feld3[0]);
 
    IO.println(feld1 == feld2);
    IO.println(feld3 == feld4);
}

a) Sag alle fünf Ausgabezeilen voraus.

b) Erkläre den Unterschied zwischen den ersten beiden Blöcken mit den Wörtern Wert und Referenz.

c) Was genau vergleicht feld1 == feld2? Was müsste man schreiben, um die Inhalte zu vergleichen?

d) Der dritte Block erzeugt eine Kopie. Ist es eine flache oder eine tiefe? Und wann fällt dieser Unterschied überhaupt auf?

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Aufgabe 2: Ein Spielfeld

Ein Spielfeld für Schiffe versenken ist ein zweidimensionales Feld aus char. '~' steht für Wasser, 'S' für ein Schiff.

a) Leg ein Feld mit 5 Zeilen und 8 Spalten an und fülle es vollständig mit '~'.

b) Setz Schiffe auf die Positionen (1, 2), (1, 3), (1, 4) und (3, 6).

c) Gib das Feld zeilenweise aus, sodass ein Raster entsteht.

d) Schreib eine Methode int zaehleSchiffe(char[][] pFeld), die alle 'S' zählt.

e) Wie viele Elemente hat das Feld insgesamt? Wie kommst du an die Anzahl der Zeilen, wie an die der Spalten?

Tipp 1: Zwei Längen

Ein zweidimensionales Feld ist in Java ein Feld von Feldern:

  • feld.length ist die Anzahl der Zeilen.
  • feld[0].length ist die Anzahl der Spalten in der ersten Zeile.

Deshalb sind die Schleifenköpfe verschieden:

for (int zeile = 0; zeile < feld.length; zeile++) {
    for (int spalte = 0; spalte < feld[zeile].length; spalte++) {
Tipp 2: Zeilenweise ausgeben

Bau jede Zeile in einer Zeichenkette zusammen und gib sie erst danach aus – genau wie bei den Mustern in den Grundlagen.

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

Aufgabe 3: Warum generisch?

Ein Behälter für genau ein Objekt lässt sich auf zwei Arten schreiben:

public class Behaelter {
    private Object inhalt;
    public void setze(Object pInhalt) { inhalt = pInhalt; }
    public Object gib() { return inhalt; }
}
 
public class Behaelter<T> {
    private T inhalt;
    public void setze(T pInhalt) { inhalt = pInhalt; }
    public T gib() { return inhalt; }
}

a) Was muss man bei der ersten Fassung tun, bevor man mit dem herausgeholten Objekt arbeiten kann?

b) Was passiert bei der ersten Fassung, wenn jemand versehentlich einen String hineinlegt und ihn als Punkt wieder herausholen will? Wann fällt das auf?

c) Wann fällt derselbe Fehler bei der zweiten Fassung auf?

d) Formuliere in einem Satz, was Generik gewinnt.

e) Nenne eine Stelle in den kommenden Kapiteln, an der Generik gebraucht wird.

Lösung. Erfrage das Passwort bei deiner Lehrkraft.

:::


Selbsttest

Rückblick

Teilbare URL erstellen

Abschnitte auswählen