Kotlin - 数据类


在本章中,我们将学习 Kotlin 数据类。Kotlin 数据类仅用于保存数据,除了保存数据之外不提供任何其他功能。

Kotlin 类定义为数据类需要满足以下条件:

  • 主构造函数需要至少有一个参数。

  • 所有主要构造函数参数都需要标记为 val 或 var。

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

  • 该类可以扩展其他类或实现接口。如果您使用 1.1 之前的 Kotlin 版本,该类只能实现接口。

句法

定义 Kotlin 数据类很简单。如果一个 Kotlin 类被标记为data关键字,那么它就成为一个数据类。例如:

data class Book(val name: String, val publisher: String, var reviewScore: Int)

Kotlin 数据类的好处是,当您声明 Kotlin 数据类时,编译器会自动生成 Constructor、toString()、equals()、hashCode() 以及其他 copy() 和 componentN() 函数。

例子

Kotlin 数据类的实例化方式与其他 Kotlin 类相同:

data class Book(val name: String, val publisher: String, var reviewScore: Int)

fun main(args: Array<String>) {

   val book = Book("Kotlin", "Tutorials Point", 10)
   
   println("Name = ${book.name}")
   println("Publisher = ${book.publisher}")
   println("Score = ${book.reviewScore}")
	  
}

当你运行上面的 Kotlin 程序时,它将生成以下输出:

Name = Kotlin
Publisher = Tutorials Point
Score = 10

复印功能

当我们定义 Kotlin 数据类时,copy() 函数会自动创建。此复制功能可用于复制对象,改变其某些属性,但保持其余属性不变。下面是一个例子:

data class Book(val name: String, val publisher: String, var reviewScore: Int)

fun main(args: Array<String>) {

   val original = Book("Kotlin", "Tutorials Point", 10)
   
   val copied = original.copy(reviewScore=5)
   
   println("Original Book")
   println("Name = ${original.name}")
   println("Publisher = ${original.publisher}")
   println("Score = ${original.reviewScore}")
   
   println("Copied Book")
   println("Name = ${copied.name}")
   println("Publisher = ${copied.publisher}")
   println("Score = ${copied.reviewScore}")
	
}

当你运行上面的 Kotlin 程序时,它将生成以下输出:

Original Book
Name = Kotlin
Publisher = Tutorials Point
Score = 10
Copied Book
Name = Kotlin
Publisher = Tutorials Point
Score = 5

toString 函数

当我们定义 Kotlin 数据类时,toString() 函数也会自动创建。该函数返回对象的字符串表示形式。下面是一个例子:

data class Book(val name: String, val publisher: String, var reviewScore: Int)

fun main(args: Array<String>) {

   val book = Book("Kotlin", "Tutorials Point", 10)

   
   println(book.toString())
	
}

当你运行上面的 Kotlin 程序时,它将生成以下输出:

Book(name=Kotlin, publisher=Tutorials Point, reviewScore=10)

hashCode() 和 equals() 函数

hasCode() 函数返回对象的哈希码。如果两个对象相等,则 hashCode() 为对象返回相同的整数值。

如果两个对象相等或者它们具有相同的 hasCode 值,则equals() 函数返回true ,否则返回false

下面是一个例子:

data class Book(val name: String, val publisher: String, var reviewScore: Int)

fun main(args: Array<String>) {

   val original = Book("Kotlin", "Tutorials Point", 10)
   
   val copy1 = original.copy(reviewScore=5)
   val copy2 = original.copy(reviewScore=7)
   
   println("Original Hashcode = ${original.hashCode()}")
   println("Copy1 Hashcode = ${copy1.hashCode()}")
   println("Copy2 Hashcode = ${copy2.hashCode()}")
   
   if( copy1.equals(copy2)){
      println("Copy1 is equal to Copy2.")
   }else{
      println("Copy1 is not equal to Copy2.")
   }
}

当你运行上面的 Kotlin 程序时,它将生成以下输出:

Original Hashcode = 1957710662
Copy1 Hashcode = 1957710657
Copy2 Hashcode = 1957710659
Copy1 is not equal to Copy2.

解构声明

我们可以使用解构声明将一个对象解构为多个变量。例如:

data class Book(val name: String, val publisher: String, var reviewScore: Int)

fun main(args: Array<String>) {

   val book = Book("Kotlin", "Tutorials Point", 10)
   
   val( name, publisher,reviewScore ) = book
   
   println("Name = $name")
   println("Publisher = $publisher")
   println("Score = $reviewScore")
	  
}

当你运行上面的 Kotlin 程序时,它将生成以下输出:

Name = Kotlin
Publisher = Tutorials Point
Score = 10

测验时间(面试和考试准备)

答案:A

解释

Kotlin 数据类被定义为仅保存数据。

问题 2 - 当我们定义 Kotlin 数据类时,默认情况下不会创建哪个函数

A - copy() 函数

B - toString() 函数

C - 组件N()

D——以上所有

答案:D

解释

所有提到的函数都是在我们定义 Kotlin 数据类时自动创建的。

答案:C

解释

函数 componentN() 用于将对象解构为多个变量。