Vertiefung - Identität und Gleichheit
Zwei Fragen beim Vergleichen
Wenn man zwei Objekte vergleicht, kann man zwei verschiedene Dinge meinen:
- Identität: Sind das wirklich ein und dasselbe Objekt (also dieselbe Referenz)?
- Gleichheit: Sind es zwei Objekte mit gleichem Inhalt?
Kotlin bietet dafür zwei Operatoren:
=== prüft die Identität: Verweisen
beide Variablen auf dasselbe Objekt?
== prüft die Gleichheit: Haben die
Objekte den gleichen Inhalt? (== ruft dazu die Methode
equals auf.)
Eigene Klassen
Für selbst geschriebene Klassen wie Figur ist equals
standardmäßig nicht festgelegt – deshalb vergleicht == hier
ebenfalls die Identität, verhält sich also wie ===.
class Figur(val farbe: String, var x: Int, var y: Int)
fun main() {
val a = Figur("blau", 0, 0)
val b = Figur("blau", 0, 0) // gleiche Werte, aber ein eigenes Objekt
val c = a // dasselbe Objekt wie a
println(a === b) // ?
println(a === c) // ?
println(a == b) // ?
}
Zwei Figuren mit denselben Werten sind also trotzdem verschieden, solange es zwei getrennte Objekte sind.
Zeichenketten
Bei String ist equals sinnvoll vorbelegt:
== vergleicht den Inhalt der Zeichenketten. Das ist fast
immer das, was man möchte.
fun main() {
val s1 = "Hallo"
val s2 = "Hal" + "lo"
println(s1 == s2) // ? vergleicht den Inhalt
println(s1 === s2) // ? vergleicht die Identität (selten benötigt)
}
== vergleicht bei Strings
den Inhalt. In manchen anderen Sprachen (z.B. Java) vergleicht == bei
Objekten die Identität – dort führt der Vergleich von Zeichenketten mit
== leicht zu Fehlern. In Kotlin benutzt du für inhaltliche Vergleiche
einfach ==.
Aufgabe 1 - Vorhersagen
Sage für beide Programme die Ausgaben voraus und überprüfe sie anschließend.
Erkläre jeweils den Unterschied zwischen == und ===.