专栏首页Android相关Kotlin---data class

Kotlin---data class

Data类与普通类的区别

  • 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函数

  • data类的toString方法会打印出具体的值
  • 非data类的toString方法则打印出地址
println(player.toString())
// PlayerClass@27c170f0

println(dataClassPlayer.toString())
// PlayerDataClass(name=Alan, age=18)

另外一个测试类的toString字节码如下

image.png

新增getComponets函数

  • data类新增属性的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函数

  • data类新增copy函数 , 可以设置属性的值
val clonedDataClassPlayer = dataClassPlayer.copy(age = 30)
println(clonedDataClassPlayer.age)
// clonedDataClassPlayer.age=30

其实也是通过解析函数 , 然后创造一个新的对象赋值返回.

copy函数的字节码

复写hashCode函数

  • data类复写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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • IjkPlayer初始化过程

    最近调研做视频秒开,使用B站开源的ijkplayer作为播放器。ijkplayer基于ffmpeg的播放器。

    None_Ling
  • Ijkplayer编译

    ijkplayer最好用ndk-r10e来进行编译,否则会出现很多Cmake等等问题

    None_Ling
  • Kotlin---类与构造函数

    Kotlin中的类定义与Java中无异,只是在Kotlin中,再也没有static所声明的静态内部类。

    None_Ling
  • 文章马伊琍离婚后微博评论太多了...用代码来解决吧

    上周末文章同学的一条微博:“吾愛伊琍,同行半路,一别两宽,餘生漫漫,依然親情守候.”

    Python编程与实战
  • TypeScript联合类型 接口

    这一块我们必须使用string或者number都支持的类型,那么下面我们可以进行调用扩展方法toString()

    HueiFeng
  • TypeScript联合类型 接口

    这一块我们必须使用string或者number都支持的类型,那么下面我们可以进行调用扩展方法toString()

    HueiFeng
  • TypeScript联合类型 接口

    这一块我们必须使用string或者number都支持的类型,那么下面我们可以进行调用扩展方法toString()

    HueiFeng
  • 使用java计算数组方差和标准差

    DrawSky
  • RTK:针对大数据的稀释曲线

    Link: https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5870771/

    生物信息知识分享
  • [GAN学习系列3]采用深度学习和 TensorFlow 实现图片修复(下)

    http://bamos.github.io/2016/08/09/deep-completion/

    材ccc

扫码关注云+社区

领取腾讯云代金券