与Java编程语言不同,Kotlin没有一个static 修改器,你可以用它来定义class 的静态函数(方法)。
Kotlin不使用static 修饰符,而是允许你在一个类里面创建一个companion object 来声明静态函数。
下面的Java代码:
class Main {
public static String hello() {
return "Hello World";
}
}
System.out.println(Main.hello()); // Hello World
等同于下面的Kotlin代码:
class Main {
companion object {
fun hello(): String {
return "Hello World"
}
}
}
println(Main.hello()) // Hello World
在这两种语言中,函数hello() ,可以用Main.hello() ,而不需要创建一个新的class 的实例。
在引擎盖下,Kotlin的companion object 在Main 类内创建了一个Companion 类,所以如果你需要从Java中调用Kotlin静态代码,你需要像这样从Companion 类中调用它。
Main.Companion.hello();
如果你不想要额外的Companion 调用,你可以在写静态函数之前添加@JvmStatic 注解,像这样:
class Main {
companion object {
@JvmStatic
fun hello(): String {
return "Hello World"
}
}
}
该注解将导致Kotlin代码在编译为Java字节码时生成一个额外的static 方法。
在下面的代码中,只有当你添加@JvmStatic 注释时,才会生成高亮的行:
public static final class Main {
@NotNull
public static final Scratch.Main.Companion Companion =
new Scratch.Main.Companion((DefaultConstructorMarker) null);
@JvmStatic
@NotNull
public static final String hello() {
return Companion.hello();
}
public static final class Companion {
@JvmStatic
@NotNull
public final String hello() {
return "Hello World";
}
private Companion() {
}
// $FF: synthetic method
public Companion(DefaultConstructorMarker $constructor_marker) {
this();
}
}
}
有了@JvmStatic 注解,你可以用同样的语法从Java中调用该方法。
Main.hello();
但只有当你从Java中调用已编译的Kotlin代码时才需要这样做。
在Kotlin对象中的Kotlin静态函数
除了在Kotlinclass 中创建一个companion object ,你还可以创建一个Kotlinobject 来保存你的静态函数。
Kotlinobject 是一个静态实例,不能像class 那样被实例化,所以它很适合存储你的静态变量和函数。
下面是Kotlin对象中的同一个静态hello() 函数:
object Main {
fun hello(): String {
return "Hello World"
}
}
println(Main.hello()) // Hello World
你可以自由地使用class 或object 来定义你在Kotlin的静态函数。