Vertiefung - Alles ist ein Objekt
Einfache Daten
Wenn man Zahlen wie 5, Wahrheitswerte wie true
oder Zeichenketten wie "Hallo" benutzt, hat man nicht unbedingt das
Gefühl Objekte zu verwenden.
Das liegt unter anderem daran, dass die Zahl 5 intuitiv keine weiteren
Eigenschaften hat und "nichts kann".
Beim Programmieren mit Kotlin ist das aber tatsächlich anders.
In Kotlin sind alle Werte Objekte einer Klasse.
Die Zahl 5 ist ein Objekt der Klasse Int.
Die Wahrheitswerte true und false sind Objekte der Klasse
Boolean.
Die Zeichenkette "Hallo" ist ein Objekt der Klasse String.
Erzeugung von Objekten
Ein wesentlicher Unterschied im Vergleich zu Klassen wie Karte oder Stapel
beseht darin, wie Objekte erzeugt werden.
Objekte der Klasse Int werden nicht mit dem Konstruktor erzeugt, sondern
durch Angabe der Zahl selbst.
Das gilt auch für die anderen "einfachen Daten".
Damit die Zahl 5 nicht jedes mal neu erzeugt werden muss und
die mehrfach erzeugte Zahl 5 nicht unnötigen Speicher belegt,
werden automatisch Optimierungen vorgenommen.
Die Experimente im folgenden Programm demonstrieren dies.
Die Anweisung System.identityHashCode(...) liefert die ID eines Objekts.
Wenn zwei Objekte die gleiche ID haben, dann handelt es sich um dasselbe Objekt im Speicher.
fun main() {
val zahl1: Int = 5
val zahl2: Int = 5
println("Zahl 1 ID: ${System.identityHashCode(zahl1)}")
println("Zahl 2 ID: ${System.identityHashCode(zahl2)}")
val bool1: Boolean = true
val bool2: Boolean = (10 > 5)
println("Boolean 1 ID: ${System.identityHashCode(bool1)}")
println("Boolean 2 ID: ${System.identityHashCode(bool2)}")
val text1 = "Informatik"
val text2 = "Informatik"
println("Informatik 1 ID: ${System.identityHashCode(text1)}")
println("Informatik 2 ID: ${System.identityHashCode(text2)}")
val basis = "Info"
val text3 = basis + "rmatik"
println("Informatik 3 ID: ${System.identityHashCode(text3)}")
}
Aufgabe 1
Lasse das Programm mehrere Male ablaufen. Experimentiere dabei mit unterschiedlichen Zahlen, Wahrheitswerten und Zeichenketten. Beschreibe wie Kotlin bei der Erzeugung von Objekten hier optimiert. (Tipp: Für Zahlen existiert eine harte Grenze, ab der Kotlin optimiert. Findest du diese heraus?)
Die angezeigte Warnung bedeutet, dass man mit den Werten der entprechenden Datentypen nicht anhand der Identität arbeiten sollte, was wir hier aber bewusst tun.
Attribute
Da in Kotlin alles ein Objekt ist, haben diese auch - potentiell - Attribute.
Für die Klassen Int und Boolean gibt es keine Attribute,
auf die wir zugreifen könnten.
Zeichenketten hingegen besitzen Attribute, von denen besonders die Länge
length oft genutzt wird.
fun main() {
val text = "Hallo Welt"
println(text.length)
}
Aufgabe 2 - Attribute
Führe das Programm mehrere Male mit unterschiedlichen Zeichenketten aus.
Methoden
Auch scheinbar einfache Daten haben in Kotlin Fähigkeiten - also Methoden. Erwähnenswert ist, dass keine dieser Methoden das Objekt selbst verändert, sondern immer ein neues Objekt mit neuen Eigenschaften zurückgibt.
fun main() {
val zahl = 5
println(zahl.inc())
println(zahl.dec())
println(zahl.plus(10))
println(zahl.times(10))
println(zahl)
val wahrheitswert = true
println(wahrheitswert.not())
println(wahrheitswert.and(true))
println(wahrheitswert.or(false))
println(wahrheitswert)
val text = "Hallo"
println(text.uppercase())
println(text.reversed())
println(text.first())
println(text)
}
Aufgabe 3 - Methoden
Lasse das Programm ablaufen und erläutere die Ausgabe.