1. Klassen und Objekte

[THEORIE]

Im Grundlagenkurs hast du mit Variablen einzelner Typen wie Int oder String gearbeitet. Sobald eine Anwendung wächst, reicht das nicht mehr aus: Ein Kunde hat einen Namen, eine E-Mail-Adresse und Bestellungen — mehrere zusammengehörige Werte plus Verhalten, das darauf arbeitet. Genau dafür gibt es Klassen.

Eine Klasse bündelt Zustand (Properties) und Verhalten (Methoden), die zusammen eine fachliche Einheit beschreiben. Ein Objekt ist eine konkrete Instanz dieser Klasse mit eigenem, von anderen Instanzen unabhängigem Zustand.

class Kunde {
    var name: String = ""
    var email: String = ""

    fun begruessen() {
        println("Hallo, ich bin $name")
    }
}

fun main() {
    val kunde = Kunde()      // erzeugt ein neues Objekt
    kunde.name = "Mia"
    kunde.email = "mia@example.com"
    kunde.begruessen()       // Hallo, ich bin Mia
}

Kunde() ruft den Konstruktor auf und erzeugt ein neues Objekt im Speicher. Über den Punkt greifst du auf dessen Properties und Methoden zu. Legst du ein zweites Objekt an (val kunde2 = Kunde()), hat es seinen eigenen, unabhängigen Zustand — kunde2.name zu ändern, hat keinen Einfluss auf kunde.name.

Wichtig ist der Unterschied zu den Werttypen aus dem Grundlagenkurs: Weist du eine Objekt-Variable einer anderen zu (val kunde2 = kunde), kopierst du nicht das Objekt, sondern nur die Referenz darauf. Beide Variablen zeigen danach auf dasselbe Objekt — eine Änderung über die eine ist auch über die andere sichtbar. Das prüfst du gleich in der Vorhersage-Aufgabe.

Standardmäßig sind Properties und Methoden einer Klasse public, also von überall aus zugänglich — dazu und zu den anderen Sichtbarkeits-Modifizierern mehr in einer späteren Lektion.

[VORHERSAGE]

Lies den Code genau durch, bevor du ihn ausführst.

vorhersage.kt
class Kunde {
    var name: String = ""
}

fun main() {
    val kunde1 = Kunde()
    kunde1.name = "Anna"

    val kunde2 = kunde1
    kunde2.name = "Ben"

    println("${kunde1.name} ${kunde2.name}")
}

Was gibt der Code aus? Ändert sich kunde1, obwohl nur kunde2.name verändert wird — genauso, wie sich bei `var b = a` (Int) nur b und nicht a ändert?

[AUFGABE]

Definiere eine Klasse Produkt mit zwei veränderlichen Properties: name vom Typ String (Startwert "") und preis vom Typ Double (Startwert 0.0). Ergänze eine Methode zeigeInfo(), die "Produkt: <name>, Preis: <preis>€" ausgibt. Lege in main() ein Produkt an, setze name auf "Tastatur" und preis auf 49.99, und rufe zeigeInfo() auf.

aufgabe.kt
fun main() { // TODO: Produkt anlegen, name und preis setzen, zeigeInfo() aufrufen } // TODO: class Produkt definieren

Bevor du einen Hint bekommst: Was hast du schon probiert, und woran hängt es genau?

[VERSTÄNDNIS-CHECK]

1. Was ist der Unterschied zwischen einer Klasse und einem Objekt?

2. Zwei Variablen `a` und `b` zeigen nach `val b = a` auf dasselbe Objekt. Was passiert, wenn du eine Property über `b` änderst?