Kotlin基础9

本文介绍了Kotlin中关于初始化的`lateinit`特性,惰性初始化的使用方法,以及初始化陷阱、继承、函数重载、类型检测和智能类型转换等概念。通过实例展示了这些概念在实际编程中的应用。
摘要由CSDN通过智能技术生成

延迟初始化:

使用lateinit关键字相当于做了一个约定: 在用它之前负责初始化
只要无法确认lateinit变量是否完成初始化,可以执行islnitialized检查

class Play4 {
    lateinit var equipment: String
    fun ready() {
        equipment = "sharp knife"
    }

    fun battle() {
        if (::equipment.isInitialized)
        println(equipment)
    }
}

fun main() {
    val p = Play4()
    p.ready()
    p.battle()
}

惰性初始化:

延迟初始化并不是推后初始化的唯一方式,你也可以暂时不初始化某个变量,直到首次使用它,这个叫作惰性初始化。

class Play5(_name: String) {
    var name = _name

    val config by lazy {loadConfig()}
//    val config =loadConfig()

    private fun loadConfig() :String{
        println("loading...")
        return "xxx"
    }

}

fun main() {
    val p = Play5("Jack")
    Thread.sleep(3000)
    println(p.config)
}

初始化陷阱

一:(先后顺序 )

在使用初始化块时,顺序非常重要,你必须保证块中的所有属性已完成初始化。

二:

这段代码编译没有问题,因为编译器看到name属性已经在init块里初始化了,但代码一运行,就会抛出空指针异常,因为name属性还没赋值,firstLetter函数就应用它

class Play7 {
    val name: String
    private fun firstLetter() = name[0]

    init {
        println(firstLetter())
        name = "Jack"
    }
}

fun main() {
    Play7()
}

三:

因为编译器看到所有属性都初始化了,所以代码编译没问题,但运行结果却是null,
问题出在哪? 在用initPlayerName函数初始化playerName时,name属性还未完成
初始化。

class Player8(_name: String) {
    val playerName:String = initPlayerName ()//2
    val name:String = _name//1
    private fun initPlayerName() = name
}

fun main() {
    println(Player8("Jack").playerName)
}

继承:

类默认都是封闭的,要让某个类开放继承,必须使用open关键字修饰它

函数重载:

父类的函数也要以open关键字修饰,子类才能覆盖它

open class Product(val name: String) {

    fun description() = "Product:$name"

    open fun load() = "Nothing.."
}
class LuxuryProduct : Product ("Luxury") {
    override fun load() = "LuxuryProduct loading..."
}

fun main() {
    val p:Product=LuxuryProduct()
    println(p.load())
}

类型检测:(as用于类型转换)

Kotlin的is运算符是个不错的工具,可以用来检查某个对象的类型

println(p is Product)
    println(p is LuxuryProduct)
    println(p is File)

    if(p is LuxuryProduct){
        println((p as LuxuryProduct).special())
    }

智能类型转换:

kotlin编译器很聪明,要能确定any is 父类条件检查属实,它就会将any当做子类类型对待,因此,编译器允许你不经类型转换直接使用。

 println((p as LuxuryProduct).special())
    println(p.special())

Kotlin层次

无须在代码里显示指定,每一个类都会继承一个共同的叫作Any的超类

println(p is Any)
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值