Assignment Chef icon Assignment Chef
All German tutorials

Programming lesson

Objekte in Java, die andere Objekte enthalten: Ein umfassendes Tutorial zur ICS 141 Lab 7 Aufgabe

Lerne, wie du in Java Objekte erstellst, die andere Objekte enthalten – mit praktischen Beispielen, Switch-Statements und For-Schleifen. Ideal für Studierende der ICS 141.

Java Objekte in Objekten ICS 141 Lab 7 Objekte enthalten andere Objekte Java Java Switch Statement Beispiel Java If-Else-If Taschenrechner Java For-Schleife Übungen Komposition in Java Java Objektorientierung Tutorial Auto Motor Objekt Java Java Getter Setter toString Java NullPointerException vermeiden Java Pakete erstellen Java Driver Klasse Beispiel Java Objektbeziehungen Java Programmierung Studium Java OOP Konzepte einfach erklärt

Einführung: Warum Objekte in Objekten?

In der objektorientierten Programmierung (OOP) spiegeln wir reale Beziehungen wider. Ein Auto enthält einen Motor, ein Student enthält eine Adresse. In Java setzen wir das um, indem wir eine Klasse als Instanzvariable einer anderen Klasse verwenden. Dieses Konzept ist zentral für die ICS 141 Lab 7 Aufgabe und wird in vielen modernen Anwendungen genutzt – von Gaming (z. B. ein Spieler-Objekt enthält ein Inventar-Objekt) bis zu Finanz-Apps (z. B. ein Konto enthält Transaktionsobjekte).

Teil 1: Switch-Statement in Java

Bevor wir uns mit Objekten beschäftigen, wiederholen wir das Switch-Statement. Es ermöglicht eine effiziente Auswahl zwischen mehreren Fällen – perfekt für einen einfachen Taschenrechner. Im ICS 141 Lab 7 müsst ihr einen Taschenrechner mit Switch vervollständigen. Hier ein Beispiel:

public class Calculator {
    public static double calculate(double a, double b, char op) {
        double result = 0;
        switch (op) {
            case '+': result = a + b; break;
            case '-': result = a - b; break;
            case '*': result = a * b; break;
            case '/': 
                if (b != 0) result = a / b;
                else System.out.println("Fehler: Division durch Null");
                break;
            default: System.out.println("Ungültiger Operator");
        }
        return result;
    }
}

Denkt daran: Jeder case sollte mit break enden, sonst fallen die folgenden Fälle durch (fall-through). Seit Java 14 könnt ihr auch den Pfeil-Operator -> verwenden – fragt in eurer Gruppe, ob ihr das nutzen dürft.

Teil 2: If-Else-If-Statement

Alternativ zum Switch könnt ihr if-else-if verwenden. Das ist flexibler, aber bei vielen Bedingungen unübersichtlich. Für den Taschenrechner wäre das:

if (op == '+') {
    result = a + b;
} else if (op == '-') {
    result = a - b;
} else if (op == '*') {
    result = a * b;
} else if (op == '/') {
    if (b != 0) result = a / b;
} else {
    System.out.println("Ungültiger Operator");
}

Wichtig: Beachtet die Reihenfolge der Bedingungen – die erste wahre Bedingung wird ausgeführt.

Teil 3: For-Schleifen

For-Schleifen wiederholen Code eine bestimmte Anzahl von Malen. In der Aufgabe sollt ihr verschiedene Schleifen testen. Ein Beispiel:

for (int i = 1; i <= 5; i++) {
    System.out.println(i + "² = " + (i*i));
}

Das gibt die Quadratzahlen von 1 bis 5 aus. Variiert die Bedingungen: i <= 10, i += 2 usw. Kommentiert im Code, was ihr beobachtet – z. B. wie oft die Schleife läuft.

Teil 4: Objekte, die andere Objekte enthalten

Jetzt zum Kern der Aufgabe: Objekte in Objekten. Stellt euch vor, ihr modelliert ein Smartphone. Ein Smartphone enthält einen Akku, eine Kamera und einen Prozessor. Jede Komponente ist ein eigenes Objekt mit Eigenschaften und Methoden. In der ICS 141 Lab 7 sollt ihr eine Liste von fünf solcher Beziehungen finden und eine implementieren.

Beispiel: Auto und Motor

Wir erstellen eine Klasse Motor (das enthaltene Objekt) und eine Klasse Auto (das enthaltende Objekt).

Schritt 1: Klasse Motor

public class Motor {
    private int leistung; // in PS
    private String kraftstoff; // z.B. "Benzin"
    private boolean gestartet;

    // Konstruktor
    public Motor(int leistung, String kraftstoff) {
        this.leistung = leistung;
        this.kraftstoff = kraftstoff;
        this.gestartet = false;
    }

    // Getter und Setter
    public int getLeistung() { return leistung; }
    public void setLeistung(int leistung) { this.leistung = leistung; }
    public String getKraftstoff() { return kraftstoff; }
    public void setKraftstoff(String kraftstoff) { this.kraftstoff = kraftstoff; }
    public boolean isGestartet() { return gestartet; }

    // Methoden
    public void starten() { 
        gestartet = true; 
        System.out.println("Motor gestartet.");
    }
    public void stoppen() { 
        gestartet = false; 
        System.out.println("Motor gestoppt.");
    }
    public void beschleunigen(int sekunden) {
        System.out.println("Beschleunige für " + sekunden + " Sekunden.");
    }

    // toString
    @Override
    public String toString() {
        return "Motor mit " + leistung + " PS, Kraftstoff: " + kraftstoff;
    }
}

Schritt 2: Klasse Auto (enthält Motor)

public class Auto {
    private String modell;
    private Motor motor; // Hier steckt das Objekt drin!

    public Auto(String modell, Motor motor) {
        this.modell = modell;
        this.motor = motor;
    }

    // Getter und Setter
    public String getModell() { return modell; }
    public void setModell(String modell) { this.modell = modell; }
    public Motor getMotor() { return motor; }
    public void setMotor(Motor motor) { this.motor = motor; }

    // Methoden, die den Motor nutzen
    public void autoStarten() {
        motor.starten();
        System.out.println("Auto " + modell + " ist bereit.");
    }
    public void autoStoppen() {
        motor.stoppen();
        System.out.println("Auto " + modell + " wurde gestoppt.");
    }

    @Override
    public String toString() {
        return "Auto: " + modell + ", " + motor.toString();
    }
}

Schritt 3: Driver-Klasse testen

public class Driver {
    public static void main(String[] args) {
        Motor v8 = new Motor(400, "Benzin");
        Auto meinAuto = new Auto("Mustang", v8);
        
        System.out.println(meinAuto);
        meinAuto.autoStarten();
        meinAuto.autoStoppen();
    }
}

Wenn ihr das ausführt, seht ihr: Das Auto enthält einen Motor und kann dessen Methoden aufrufen. Das ist das Prinzip der Komposition.

Weitere Ideen für eure Liste

Überlegt euch fünf Beispiele aus dem Alltag oder der Technologie:

  • Computer enthält CPU, RAM, Festplatte
  • Flugzeug enthält Flügel, Triebwerk, Fahrwerk
  • Smartphone enthält Akku, Kamera, Bildschirm
  • Student enthält Adresse, Kursliste
  • Spieler in einem Game enthält Inventar, Charakterstatistiken

Wählt eines aus und implementiert es ähnlich wie oben. Denkt an die drei Instanzvariablen, Getter/Setter und drei Methoden für das innere Objekt. Das äußere Objekt muss zwei Instanzvariablen haben, wovon eine das innere Objekt ist, plus zwei Methoden, die das innere Objekt nutzen.

Trend-Beispiel: Gaming – Spieler und Inventar

Stellt euch vor, ihr entwickelt ein Battle-Royale-Spiel wie Fortnite. Ein Spieler enthält ein Inventar (eine Liste von Gegenständen). Das Inventar wiederum kann Waffen, Heiltränke usw. enthalten. In Java könntet ihr das so modellieren:

public class Inventar {
    private List<String> gegenstaende;
    private int kapazitaet;

    // Konstruktor, Getter/Setter, Methoden wie addGegenstand(), removeGegenstand()
}

public class Spieler {
    private String name;
    private int leben;
    private Inventar inventar;

    // Methoden: aufnehmen(), benutzen()
}

Das ist genau das Prinzip der Aufgabe. Nutzt solche Beispiele, um das Konzept zu verstehen.

Häufige Fehler und Tipps

  • NullPointerException: Vergesst nicht, das innere Objekt zu initialisieren, bevor ihr es nutzt. Im Konstruktor des äußeren Objekts solltet ihr das innere Objekt entweder übergeben oder neu erstellen.
  • toString() richtig überschreiben: Ruft im äußeren Objekt die toString()-Methode des inneren Objekts auf, wie in return "Auto: " + modell + ", " + motor.toString();
  • Getter und Setter: Definiert sie für alle Instanzvariablen, auch für die Objektvariable. So könnt ihr später das enthaltene Objekt austauschen.
  • Paketstruktur: Achtet auf die richtige Paketnamen (ObjectsWithinObjects) und importiert ggf. benötigte Klassen.

Fazit

Das Erstellen von Objekten, die andere Objekte enthalten, ist eine grundlegende Technik in Java und OOP. Mit den Beispielen aus diesem Tutorial – vom Taschenrechner über For-Schleifen bis zur Auto-Motor-Komposition – seid ihr gut gerüstet für die ICS 141 Lab 7 Aufgabe. Denkt daran: Übung macht den Meister. Probiert verschiedene Beispiele aus und diskutiert in eurer Gruppe. Viel Erfolg!