数据类:data class

QuibblerQuibbler 2020-11-09 约 5 分钟 1701 次阅读

数据类:data class

在Java中toString()、equals()、hashCode()方法非常熟悉,这是Object基类中的固有方法。重写hashCode()和equals()实现对象之间的比较。toString()方法就更不用说了,如果要打印某个对象,就需要重写toString()再拼凑字符串,很麻烦!

1、数据类

好在Kotlin总结了很多Java开发中的痛点,不必再重写这些基础方法.

1.1、data定义数据类

只需要在类声明class前面添加data修饰符,上面的一些方法就自动生成。必须将要纳入考虑的属性放在数据类的主构造函数中:

class Book(val id: Int, var name: String, var price: Float) {
}

1.2、重写的方法

data自动生成了如下几个方法:

equals(): Boolean
    hashCode(): Int
    toString(): String
    component() 函数对应的属性
    copy()

1.3、示例

创建一个data数据类

class Book(val id: Int, var name: String, var price: Float) {
}

创建对象,并打印:

val book = Book(100, "Harry Potter", 33.4f)
    println(book)
    //打印结果
    Book(id=100, name=Harry Potter, price=33.4)

创建另一个对象,比较和前一个对象是否相等:

val book2 = Book(100, "Harry Potter", 33.4f)
    println(book == book2)
    //打印结果
    true

如果把data数据类修饰符去掉,再运行一遍试试,结果完全不一样

class Book(val id: Int, val name: String, var price: Float)
    
    val book = Book(100, "Harry Potter", 33.4f)
    val book2 = Book(100, "Harry Potter", 33.4f)
    println(book == book2)
    println(book)
    
    //打印结果
    false
    com.quibbler.kotlin.learn.Book@ccc14b7

2、注意点

①data类的主构造函数中声明的属性才会被考虑用来生成toString()、equals()等方法

data class Book(val id: Int, var name: String, var price: Float) {
    var other = 11
        set(value) {
            field = value
        }
}

即使两个对象中的非主构造函数中的属性不一样,数据类比较不会将其考虑在内:

val book = Book(100, "Harry Potter", 33.4f)
    val book2 = Book(100, "Harry Potter", 33.4f)
    book2.other =99
    println(book == book2)
    //输出true,即使other属性不一样

②数据类必须要有至少一个属性值,不然的话用什么属性来衡量呢?

③主构造函数中的所有参数必须被标记为val或者var。可以用copy()函数创建对象副本并且同时修改某些val属性的值

data class Book(val id: Int, val name: String, var price: Float) {
        fun copy(name: String = this.name, price: Float = this.price) = Book(this.id, name, price)
    }

    //用copy函数创建数据类实例副本
    val book = Book(100, "Harry Potter", 33.4f)
    val bookOther = book.copy("Kotlin", 4.4f)
    println(bookOther)

④数据类不能是抽象的,内部的,开放的或密封的。

相关博客:

       Kotlin数据类

       Kotlin---data class

相关推荐

Parcelize:Parcelable 实现生成器
Kotlin

Parcelize:Parcelable 实现生成器

Parcelize:Parcelable 实现生成器Parcelable是安卓开发中常用的序列化方式,之前分享过一个Parcelable序列化插件,方便开发者快速生成代码,提高开发效率。1、Parcelize插件Kotlin官方也推出一个Parcelable自动生成的Gradle插件:Parcelize。1.1、引入插件在项目的build.gradle中添加:id("kotlin-parceliz

2.6k
Kotlin的继承
Kotlin

Kotlin的继承

Kotlin的继承1、超类:Any类似于Java中的Object类,Kotlin也有一个叫Any的超类,是所有类的父类,所有类都默认继承自该类。超类的定义如下,其中定义了三个函数:2、open注意上面的Any类用open修饰,表示该类可以被继承。Kotlin中的类默认都是final的,无法被继承:如果想让类可以被继承,就需要用在定义类的地方用open关键字标识该类可以被继承。3、构造器继承中涉及到

2.1k
 Kotlin基本语法
Kotlin

Kotlin基本语法

Kotlin基本语法了解Kotlin语言的基本语法。1、包kotlin文件以.kt结尾,编译文件还是如此只不过在文件名后面加上Kt后缀。这一点和Java不同,Java源文件.java,编译后为.class文件。1.1、包定义每个kotlin文件的第一行就用关键字package定义该文件所在的包。例:1.2、导包用到其它kotlin文件需要使用关键字import导入,这一点和Java一样。kotli

2.1k