在 Kotlin 中,data class
和 class
都是用来定义类的关键字,但它们有以下几点区别:
- 自动实现基本方法:
data class
会自动提供equals()
、hashCode()
、toString()
等基本方法的实现,而class
则需要手动实现这些方法。 - 属性必须是 val 或 var:
data class
的所有属性都必须是val
或var
,并且不能是private
,否则编译器会报错。class
的属性可以是任意可见性。 - 主构造函数:
data class
必须有一个主构造函数,并且主构造函数的参数都必须是val
或var
。class
可以没有主构造函数。 - 数据类不能继承其他类:
data class
不能继承其他类(除了Any
),而class
可以继承其他类。 - 不支持抽象属性和抽象方法:
data class
不支持抽象属性和抽象方法,所有的属性和方法都必须是具体的。class
支持抽象属性和抽象方法。 - 不支持 open 关键字:
data class
不支持open
关键字,不能被其他类继承。class
可以使用open
关键字被其他类继承。 - copy() 方法:
data class
自动提供一个copy()
方法,用于创建一个与当前对象相同但可以修改部分属性的新对象。class
没有这个方法,需要手动实现。 - componentN() 函数:
data class
自动提供componentN()
函数,用于解构声明。class
没有这个函数,需要手动实现。
下面是一个简单的示例,展示了 data class
和 class
的不同用法:
// Data class
data class Person(val name: String, val age: Int)
// Class
class Employee(val name: String, val age: Int, val salary: Double) {
override fun equals(other: Any?): Boolean {
// 手动实现 equals() 方法
}
override fun hashCode(): Int {
// 手动实现 hashCode() 方法
}
override fun toString(): String {
// 手动实现 toString() 方法
}
}
// 使用示例
val person = Person("John", 30)
val employee = Employee("Jane", 25, 50000.0)
// 自动实现的方法
println(person.equals(Person("John", 30))) // true
println(person.toString()) // Person(name=John, age=30)
// copy() 方法
val updatedPerson = person.copy(age = 31)
println(updatedPerson) // Person(name=John, age=31)
// 解构声明
val (name, age) = person
println("$name is $age years old.") // John is 30 years old.
在实际开发中,data class
适合用于简单的数据容器,例如 POJO(Plain Old Java Object)或 DTO(Data Transfer Object),而 class
则更适合用于复杂的业务逻辑或需要继承和扩展的类。