Kotlin 中 val const JvmField JvmStatic 的区别
目录
Kotlin 中 val const JvmField JvmStatic 的区别
四个关键字的本质含义
val的含义是 不可变,等价于final- 所以其有 getter 无 setter,因为有 setter 的话就违背了其
不可变的特性
- 所以其有 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/val,const只可以修饰常量val@JvmField不能和private一起使用,const可以和private一起使用@JvmField可以用在普通的 class 中,const只是用在object或顶层中const_val are only allowed on top level or in objectsconst_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()
- class/object 中的
- Kotlin 中的
@JvmField属性:可以直接访问,并且没有 getter/setter 方法class中的@JvmField var等价于public,需要借助对象访问class中的@JvmField val等价于public finalobject中的@JvmField var等价于public static,可以脱离对象直接访问object中的@JvmField val等价于public static final,且会被 IDE 提示改为const val
- Kotlin 中的
const属性:静态变量/静态常量,并且没有 getter/setter 方法object中的const val等价于@JvmField val,等价于public static finalobject中的private const val等价于private static final,只能在 object 内部才能访问
- Kotlin 中的
@JvmStatic成员:静态成员- 其是专门为应对 Java 中的 static 而生的,对 Kotlin 来说,这个关键字并没有什么意义
- 由于其仅可以应用在
object中,所以其天生就是为了,让 Java 中可以以静态方式访问而生的
2022-5-4
本文来自博客园,作者:白乾涛,转载请注明原文链接:https://www.cnblogs.com/baiqiantao/p/16220140.html

浙公网安备 33010602011771号