Kotlin基础 — 数据类、密封类、枚举类

目录

  1. 数据类
    1. 数据类的写法
    2. 属性声明在类的body()中
    3. 对象的Copying
    4. 数据类的解构
  2. 密封类
  3. 枚举类

数据类

1. 数据类的写法
// 使用 data class 修饰
data class Person(val name:String, val age: Int, val city: String)

// 不使用 data 修饰
class Person(val name:String, val age: Int, val city: String)

使用 data class 修饰和不使用 data 修饰的数据类的区别:

方法data classclass
equals()实现未实现
hashCode()实现未实现
toString()实现未实现
componentN()实现未实现
copy()实现未实现
2. 属性声明在类的body()中

写在类的body()中的字段不包含在 toString() 等方法中;

data class Person(val name:String, val age: Int) {
    // 必须要初始化
    val city: String = ""
        get() = field.toUpperCase() //获取当前字段的值必须要使用 `field`
}

示例代码:

val json = """{
    "name" : "Elson",
    "age" : 18,
    "city" : "Shanghai"
}"""
val person = Gson().fromJson(json, Person::class.java)
person.toString() //Person(name=Elson, age=18) 缺少city
person.city //SHANGHAI
3. 对象的Copying

fun copy(val name:String, val age: Int) = Person(name, age)

示例代码:

val json = """{
    "name" : "Elson",
    "age" : 18,
    "city" : "Shanghai"
}"""
val person = Gson().fromJson(json, Person::class.java)
person.toString() //Person(name=Elson, age=18) 缺少city
person.city //SHANGHAI
// 对象copy()
val newPerson = person.copy(name = "张三")
newPerson.toString() //Person(name=张三, age=18) 
newPerson.city //"" 空字符串(由于字段city没有在主构造里面,拷贝的时候,新对象也不包含该字段,所以取得默认值空字符串)
4. 数据类的解构
val person = Person("Elson", 18) 
val (name, age) = person //对象结构到对应的位子字段里,(name, age)属于Pair类型
println("$name, $age years of age")

密封类 sealed

声明密封类,在类名前加上sealed修饰符。密封类可以有子类,但所有子类都必须在密封类对应的文件中声明。(在Kotlin1.1之前,规则更加严格:类必须在密封类中声明)。密封类的间接子类可以在任何地方。

sealed class Expr
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 Const -> expr.number
    is Sum -> eval(expr.e1) + eval(expr.e2)
    NotANumber -> Double.NaN
    // 无须 `else` 字句,因为已经覆盖所有条件
}

枚举类

…略…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值