Hi 大家好,我是 DHL,大厂程序员,公众号:ByteCode ,在美团、快手、小米工作过。搞过逆向,做过性能优化,研究过系统,擅长鸿蒙、Android、Kotlin、性能优化、职场分享。
来自微信小程序「猿面试」每日分享一道大厂面试题,涉及 Java、Android、鸿蒙和ArkTS、设计模式、算法和数据结构 等内容。
kotlin 中 lateinit、lazy、const 的区别
在 Kotlin 中,lateinit、lazy 和 const 是用于处理变量初始化和延迟初始化的不同机制。
lateinit var
lateinit 关键字延迟初始化,用于声明一个非空类型的变量,但不立即初始化它。这个变量必须在它第一次被使用之前被初始化,否则会抛出 UninitializedPropertyAccessException 异常。
只能用于类属性(即成员变量),而不能用来修饰局部变量。这是因为 lateinit 的主要目的是允许你在类的实例化过程中延迟初始化某个属性,直到它第一次被明确地赋值。
只能用来修饰对象,不能用来修饰基本类型(因为基本类型在类加载后的准备阶段都会被初始化为默认值)
by lazy
by lazy 通常与 val 关键字一起使用,初始化后属性的值不可变,在 java 中相当于被 final 修饰,它提供了一种延迟初始化变量的方式。变量只有在第一次被访问时才会被初始化,并且之后的访问都会返回相同的值。
const val
val 用来声明只读变量。也就相当于,java 中 final 修饰的变量。在 Java 中会生成一个带有 getter 方法的属性。因此,你不能在 Java 中直接访问 val 变量,而是需要通过它的 getter 方法来访问。
const 声明编译期的常量,const 修饰的常量需要同时满足以下三个条件:
-
类型限制:
const只能用于基本数据类型(如Int、Long、Float、Double、Boolean)和String类型。 -
作用域限制:
const只能在顶层(top-level)、object 声明的成员或者 companion object 的成员中使用。 -
const不能单独修饰某个变量,需要和val同时修饰一个变量
在 Kotlin 中声明的 const val 属性实际上是编译时常量。在 Java 中,它们会被视为普通的静态 final 字段,因此你可以 Java 中直接访问它们,就像访问 Java 中的静态 final 字段一样。
更多大厂面试题,欢迎前往微信搜索小程序 「猿面试」 查看。微信小程序 (猿面试) 包含了 Java、Android、鸿蒙和ArkTS、设计模式、算法和数据结构 相关内容,
更多面试题: