toString
函数会被复写为打印具体属性的值components
方法 , 获取对应属性的值copy
方法 , 可以用来修改具体属性的值hashCode
方法 , 不再比较对象引用 , 而是比较对象的值data class PlayerDataClass(val name: String, var age: Int) {
var point: Int = 0
constructor(name: String, age: Int, point: Int) : this(name, age) {
this.point = point
}
}
toString
方法会打印出具体的值toString
方法则打印出地址println(player.toString())
// PlayerClass@27c170f0
println(dataClassPlayer.toString())
// PlayerDataClass(name=Alan, age=18)
另外一个测试类的toString字节码如下
image.png
component
方法component1
代表第一个属性 , components
代表第二个属性println(dataClassPlayer.component1())
// Alan
println(dataClassPlayer.component2())
// 18
/* Destructuring Declarations */
val (name, age) = dataClassPlayer
println("dataClassPlayer's name = $name, age = $age")
// dataClassPlayer's name = Alan, age = 18
copy
函数 , 可以设置属性的值val clonedDataClassPlayer = dataClassPlayer.copy(age = 30)
println(clonedDataClassPlayer.age)
// clonedDataClassPlayer.age=30
其实也是通过解析函数 , 然后创造一个新的对象赋值返回.
copy函数的字节码
hashCode
函数 , 比较对象属性的值 , 而非地址// 非data类
val player1 = PlayerClass("Peter", 24)
val player2 = PlayerClass("Peter", 24)
println(player1.equals(player2))
// false. call === implicitly
println(player1.hashCode())
// 1414644648
println(player2.hashCode())
// 640070680
// data类
val dataClassPlayer1 = PlayerDataClass("Peter", 24)
val dataClassPlayer2 = PlayerDataClass("Peter", 24)
println(dataClassPlayer1.equals(dataClassPlayer2))
// true
println(dataClassPlayer1.hashCode())
// -1907803220
println(dataClassPlayer2.hashCode())
// -1907803220
另外一个类的hashCode字节码如下
image.png