/** * 主构造函数至少包含一个参数 * 所有的主构造函数的参数必须标识为val 或者var * 数据类不可以声明为abstract open、sealed或者inner * 数据类不能继承其他类,但是可以实现接口 */ //关键字为data data class User(val name:String,val age:Int){ // fun copy(name: String=this.name,age: Int=this.age)=User(name,age) } /**** * * 密封类 * 受限的类继承结构:当一个值为有限的几种类型, * 而不能有任何其他类型时,在某种意义上,他们是枚举类的扩展 * 枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例 * 而密封类的一个子类可以有可包含状态的多个实例 * sealed * 可以有子类,但子类必须内嵌在密封类中 *密封类 * 1.密封类用sealed关键词表示 * 2.密封类的子类只能定义在密封类的内部或同一个文件中,因为其构造方法为私有的 * 3.密封类相比于普通的open类,可以不被此文件外被继承,有效保护代码 * 4.与枚举的区别:密封类适用于子类可数的情况,枚举适用于实例可数的情况 * sealed不能修饰interface、abstract class * * ***/ sealed class PlayerCmd{ val playerName :String = "player" class Player(val url:String,val position:Long = 0):PlayerCmd(){ fun showUrl(){ println("$url ,$position") } } class Seek(val position: Long):PlayerCmd()//快进 object Pause:PlayerCmd() } //(密封类的子类也可以定义在密封类的外部,但要在同一个文件中) object Resume :PlayerCmd() object Stop:PlayerCmd() enum class PlayerState{ IDLE,PAUSE,PLAYING,STOP } fun main(args:Array<String>){ val jack = User("jack",12) val oldjack = jack.copy(age=2) println(jack) println(oldjack) PlayerCmd.Player("苍茫的天涯").showUrl() println(Resume.playerName) println(Stop.playerName) }
原文地址:https://www.cnblogs.com/endian11/p/10860904.html
时间: 2024-11-04 16:32:34