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 数据类时,编译器会自动生成构造函数、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

Copy 函数

当我们定义 Kotlin 数据类时,copy() 函数会自动创建。此 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() 对这些对象返回相同的整数值。

equals() 函数如果两个对象相等或具有相同的 hasCode 值,则返回 **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

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

Q 2 - 当我们定义 Kotlin 数据类时,哪个函数不是默认创建的?

A - copy() 函数

B - toString() 函数

C - componentN()

D - 以上所有

答案:D

解释

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

答案:C

解释

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

广告