目录
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 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()
- class/object 中的
- 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