个人主体可以做网站吗,wordpress免费教程视频教程,核酸结果查询,门户网站建设申请数据类
数据类主要用于存储数据。
对于每个数据类#xff0c;编译器会自动生成一些额外的成员函数#xff0c;这些函数支持将实例打印为易读的输出、比较实例、复制实例等操作。
数据类使用 data 关键字标记#xff1a;
data class User(val name: String, val age: Int…数据类
数据类主要用于存储数据。
对于每个数据类编译器会自动生成一些额外的成员函数这些函数支持将实例打印为易读的输出、比较实例、复制实例等操作。
数据类使用 data 关键字标记
data class User(val name: String, val age: Int)编译器会根据主构造函数中声明的所有属性自动派生以下成员 equals() / hashCode() 对。 格式为 User(nameJohn, age42) 的 toString() 函数。 与属性声明顺序相对应的 componentN() 函数。 copy() 函数详见下文。
为确保生成代码的一致性和有意义的行为数据类必须满足以下要求 主构造函数必须至少有一个参数。 主构造函数的所有参数都必须标记为 val 或 var。 数据类不能是 abstract抽象的、open开放的、sealed密封的或 inner内部的。
此外关于数据类成员的继承其生成遵循以下规则 如果数据类主体中有 equals()、hashCode() 或 toString() 的显式实现或者超类中有这些函数的 final 实现那么不会生成这些函数而是使用现有的实现。 如果超类型有 open开放的且返回兼容类型的 componentN() 函数那么会为数据类生成相应的函数并覆盖超类型的这些函数。如果由于签名不兼容或超类型的函数是 final 而无法覆盖将会报错。 不允许为 componentN() 和 copy() 函数提供显式实现。
数据类可以继承其他类。
open class Person(val name: String) {open fun introduce() {println(My name is $name.)}
}// 定义一个继承自 Person 的数据类。
data class Employee(val id: Int, val name2: String, val department: String) : Person(name2) {override fun introduce() {super.introduce()println(Im an employee with ID $id, working in the $department department.)}
}fun main() {// 创建 Employee 数据类的实例。val employee Employee(1, John, IT)// My name is John.// Im an employee with ID 1, working in the IT department.employee.introduce()println(employee) // Employee(id1, name2John, departmentIT)// 创建另一个相同属性的 Employee 实例。val anotherEmployee Employee(1, John, IT)// 比较两个实例是否相等。println(Are they equal? ${employee anotherEmployee}) // Are they equal? true
}在 JVM 上如果生成的数据类需要有无参构造函数那么必须为属性指定默认值
data class User(val name: String , val age: Int 0)类体中声明的属性
编译器仅会使用主构造函数内定义的属性来自动生成相关函数。若要将某个属性排除在自动生成的实现之外可在类体中声明该属性
data class Person(val name: String) {var age: Int 0
}在以下示例中toString()、equals()、hashCode() 和 copy() 这些自动生成的实现默认仅使用 name 属性并且只有一个组件函数 component1()。age 属性是在类体中声明的因此被排除在外。所以两个 name 相同但 age 值不同的 Person 对象会被视为相等因为 equals() 方法仅评估主构造函数中的属性
val person1 Person(John)
val person2 Person(John)person1.age 10
person2.age 20println(person1 person2: ${person1 person2})
// person1 person2: trueprintln(person1 with age ${person1.age}: ${person1})
// person1 with age 10: Person(nameJohn)println(person2 with age ${person2.age}: ${person2})
// person2 with age 20: Person(nameJohn)复制对象
可以使用 copy() 函数来复制一个对象这样你就能在保持部分属性不变的同时修改其他属性。对于上述 User 类该函数的实现如下
fun copy(name: String this.name, age: Int this.age) User(name, age)然后你就可以编写如下代码
val jack User(name Jack, age 1)
val olderJack jack.copy(age 2)数据类与解构声明
为数据类生成的组件函数 componentN() 使得数据类可以用于解构声明
val jane User(Jane, 35)
val (name, age) jane
println($name, $age years of age) // Jane, 35 years of age标准数据类
标准库提供了 Pair 和 Triple 类。不过在大多数情况下使用具名数据类是更好的设计选择因为具名数据类能为属性提供有意义的名称从而使代码更易读。