官方的说明如下
伴生函数:
在 “companion object” 中的公共函数必须用使用 @JvmStatic 注解才能暴露为静态方法。
如果没有这个注解,这些函数仅可用作静态 Companion 字段上的实例方法。
伴生常量:
在 companion object 中的公共、非 const 的属性 实际上为常量 必须用 @JvmField 注解才能暴露为静态字段。
如果没有这个注解,这些属性只能作为静态 Companion 字段中奇怪命名的 ‘getters’ 实例。而只使用 @JvmStatic 而不是 @JvmField 的话,会将奇怪命名的 ‘getters’ 移到类的静态方法中,但仍然是不正确的。
下面我们开看一下java中的静态变量与静态方法:
public class StaticClass{
private in paramFirst=0;
public static final String address="测试的地址"
public static void method(){
Log.d("clark","this is test log");
}
}
我们把它转化成kotlin代码会得到结果如下
class StaticClass{
private var paramsFirst=0;
companion object{
val address="测试的地址"
fun method(){
Log.d("clark","this is test log");
}
}
}
静态变量个静态方法都会放到kotlin类的伴生体中,成为伴生常量和伴生方法。这时候如果要在java中调用这些,会是如下的方式:
StaticClass.Companion.getParamFirst();
StaticClass.Companion.method();
这显然是于我们平时的调用习惯不一样的,为了保持使用习惯的一致,则需要分别加上JvmField,JvmStatic注解。这样才能让它们暴露成为静态变量与静态方法。
class StaticClass{
private var paramsFirst=0;
companion object{
@JvmField val address="测试的地址"
@JvmStatic fun method(){
Log.d("clark","this is test log");
}
}
}
这样调用的话就是
StaticClass.paramFirst;
StaticClass.method()
还有几个注意点,标注出来,大家使用的时候注意一下。
- @JvmField消除了变量的getter与setter方法
- @JvmField修饰的变量不能是private属性的
- @JvmStatic只能在object类或者伴生对象companion object中使用,而@JvmField没有这些限制
- @JvmStatic一般用于修饰方法,使方法变成真正的静态方法;如果修饰变量不会消除变量的getter与setter方法,但会使getter与setter方法和变量都变成静态