// // represents a full name // class FullName1(val first: String, val last: String) // val fn1HP = FullName1("Harry", "Potter") // val fn1HP2 = FullName1("Harry", "Potter") // val fn1HP3 = fn1HP // aliasing: notice same memory address // val fn1HG = FullName1("Hermione", "Granger") // // FYI: FullName1 inherits from Any // // https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/ // println(fn1HP) // println(fn1HG) // println(fn1HP3) // println("actually same (should be true): ${ fn1HP == fn1HP }") // println("different values (should be false): ${ fn1HP == fn1HG }") // println("same values (should be true): ${ fn1HP == fn1HP2 }") // println("same address (should be true): ${ fn1HP == fn1HP3 }") // class FullName2(val first: String, val last: String) { // override fun toString(): String = "FullName2(first=$first, last=$last)" // } // val fn2HP = FullName2("Harry", "Potter") // val fn2HP2 = FullName2("Harry", "Potter") // val fn2HG = FullName2("Hermione", "Granger") // println(fn2HP) // println(fn2HG) // println("different values (should be false): ${ fn2HP == fn2HG }") // println("same values (should be true): ${ fn2HP == fn2HP2 }") class FullName3(val first: String, val last: String) { override fun toString(): String = "FullName3(first=$first, last=$last)" override fun equals(other: Any?): Boolean { return (other is FullName3) && (this.first == other.first) && (this.last == other.last) } } val fn3HP = FullName3("Harry", "Potter") val fn3HP2 = FullName3("Harry", "Potter") val fn3HG = FullName3("Hermione", "Granger") println(fn3HP) println(fn3HG) println("different values (should be false): ${ fn3HP == fn3HG }") println("same values (should be true): ${ fn3HP == fn3HP2 }")