zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Kotlin 中 val const JvmField JvmStatic 的区别

Kotlin 区别 const val
2023-09-14 09:00:05 时间

本文地址


目录

val const JvmField JvmStatic

四个关键字的本质含义

  • val 的含义是 不可变,等价于 final
    • 所以其有 getter 无 setter,因为有 setter 的话就违背了其 不可变 的特性
  • const 的含义是 常量,等价于 static final
    • 所以其只能修饰 val 属性,不能修饰 var 属性,因为修饰 var 的话就违背了其 常量 的特性
    • Modifier const is not applicable to vars
  • @JvmField 的含义是 字段,也就是说 可被直接访问
    • 用其修饰的属性会被直接访问,而不是通过 getter/setter 方法间接访问(也没有这两个方法)
    • 所以其不能修饰 private 属性,因为修饰 private 的话就违背了其 可被直接访问 的特性
    • @JvmField has no effect on a private property
  • @JvmStatic 的含义是 静态,其是专门为应对 Java 中的 static 静态 而生的
    • 作用于属性时,会把其 get/set 方法变成静态的。PS:属性本身会被转换成private static
    • 作用于方法时,会把该方法变成静态
    • 其意义仅仅在于,让在 Java 中调用 Kotlin 的时候,和在 Kotlin 中调用 Kotlin 的时候,一样友好
    • Only members in named_objects and companion_objects can be annotated with @JvmStatic

const 和 JvmField 的区别

  • @JvmField 可以修饰 var/valconst 只可以修饰常量 val
  • @JvmField 不能和 private 一起使用,const 可以和 private 一起使用
  • @JvmField 可以用在普通的 class 中,const 只是用在 object 或顶层中
    • const_val are only allowed on top level or in objects
    • const_val might be used instead of @JvmField_val in objects

从 Java 的角度来看

  • Kotlin 中的普通属性不能直接访问,需要通过其 getter/setter 间接访问
    • class/object 中的 var 有 getter 有 setter,等价于 private
    • class/object 中的 val 有 getter 无 setter,等价于 private final
    • 注意,从 Java 的角度来看,object 中的 var/val 依旧是普通属性,而非静态属性
    • 因为属性需要通过对象 INSTANCE 间接访问,例如:Man.INSTANCE.getName()
  • Kotlin 中的 @JvmField 属性:可以直接访问,并且没有 getter/setter 方法
    • class 中的 @JvmField var 等价于 public,需要借助对象访问
    • class 中的 @JvmField val 等价于 public final
    • object 中的 @JvmField var 等价于 public static,可以脱离对象直接访问
    • object 中的 @JvmField val 等价于 public static final,且会被 IDE 提示改为 const val
  • Kotlin 中的 const 属性:静态变量/静态常量,并且没有 getter/setter 方法
    • object 中的 const val 等价于 @JvmField val,等价于 public static final
    • object 中的 private const val 等价于 private static final,只能在 object 内部才能访问
  • Kotlin 中的 @JvmStatic 成员:静态成员
    • 其是专门为应对 Java 中的 static 而生的,对 Kotlin 来说,这个关键字并没有什么意义
    • 由于其仅可以应用在 object 中,所以其天生就是为了,让 Java 中可以以静态方式访问而生的

2022-5-4