1.数据类
经常创建一些只保存数据的类。 在这些类中,一些标准函数往往是从数据机械推导而来的。在 Kotlin 中,这叫做 数据类 并标记为 data
:
data class Person(val name: String, val age: Int)
复制
在很多情况下,我们需要复制一个对象改变它的一些属性,但其余部分保持不变。 copy()
函数就是为此而生成。对于上文的 User
类,其实现会类似下面这样:
data class User(val name: String , val age: Int )
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
解构声明
有时把一个对象 解构 成很多变量会很方便,例如:
val (name, age) = jane //结构声明
一个解构声明会被编译成以下代码:
var name=jane.component1() var age=jane.component2()
任何表达式都可以出现在解构声明的右侧,只要可以对它调用所需数量的 component 函数即可。 当然,可以有 component3()
和 component4()
等等
2.密封类
密封类用来表示受限的类继承结构:当一个值为有限几种的类型, 而不能有任何其他类型时。在某种意义上,他们是枚举类的扩展:枚举类型的值集合 也是受限的,但每个枚举常量只存在一个实例,而密封类 的一个子类可以有可包含状态的多个实例。
声明一个密封类,使用 sealed 修饰类,密封类可以有子类,但是所有的子类都必须要内嵌在密封类中。
sealed 不能修饰 interface ,abstract class(会报 warning,但是不会出现编译错误)
sealed class Expr{ //密封类 默认private
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
}
fun eval(expr: Expr): Double = when (expr) {
is Expr.Const -> expr.number
is Expr.Sum -> eval(expr.e1) + eval(expr.e2)
Expr.NotANumber -> Double.NaN
}
一个密封类是自身抽象的,它不能直接实例化并可以有抽象(abstract)成员。
密封类不允许有非-private 构造函数(其构造函数默认为 private)