枚举类&&扩展&&数据类
枚举类
enum class Direction private constructor(val d:Int){
NORTH(1),SOUTH(2),WEST(3),EAST(4);
override fun toString(): String {
return d.toString()
}
}
fun main(){
val direction1:Direction=Direction.NORTH
val direction2:Direction=Direction.WEST
println(direction1.name)//NORTH
println(direction2.ordinal)//2 获取索引从0开始
println(Direction.valueOf("SOUTH"))//2
for (i in Direction.values()){
println(i)//1 2 3 4
}
}
扩展函数
扩展函数是在顶层函数中实现的,而且不能使用 open关键字
class Myclass(){
fun Instansce(){
println("我是内部成员函数")
}
}
fun Myclass.Instansce(){
println("我是顶层函数")
}
fun main(){
println(Myclass().Instansce())//内部成员函数优先级高,通过扩展函数无法覆盖内部成员函数
}
扩展变量
给导入的包扩展
在本类中可以扩展其它类不可以扩展本类
在类中扩展的函数可以被继承
扩展成员函数,先执行子类被重写的扩展函数,
数据类
data class User(var name: String, var age: Int) {
}
fun main() {
var u = User("蛮吉", 23)
println(u)//User(name=蛮吉, age=23)
println(u.name)//蛮吉
u.name="满大人"
println(u.name)//"满大人"
val(name,age)=u
println("$name :: $age")
}
封闭类
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
fun main(){
val const = Const(100.0)
println("RS "+eval(NotANumber))
}
fun eval(expr: Expr): Double = when (expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
}