问题描述
Kotlin中没有static
关键字,也就是没有直接定义静态函数/静态方法的static关键字。那么用Kotlin表示类似JAVA的static静态
方法的方式是?
最佳回答
将函数放在”companion object”中。
所以像这样的java代码:
class Foo {
public static int a() { return 1; }
}
会变成
class Foo {
companion object {
fun a() : Int = 1
}
}
然后,您可以从Kotlin代码内部使用它,如下所示:
Foo.a();
但是从Java代码中,您需要将其写作
Foo.Companion.a();
(注:上面这个写法在Kotlin中也有效。)
如果您不想指定Companion
位,则可以添加@JvmStatic
批注或命名您的Companion类。
根据docs:
Companion Objects
An object declaration inside a class can be marked with the companion keyword:
class MyClass { companion object Factory { fun create(): MyClass = MyClass() } }
Members of the companion object can be called by using simply the class name as the qualifier:
val instance = MyClass.create()
…
However, on the JVM you can have members of companion objects generated as real static methods and fields, if you use the
@JvmStatic
annotation. See the Java interoperability section for more details.
添加@JvmStatic
批注看起来像这样
class Foo {
companion object {
@JvmStatic
fun a() : Int = 1;
}
}
然后它将作为一个真正的Java静态函数存在,可以从Java和Kotlin中以Foo.a()
的形式进行访问。
如果只是不喜欢Companion
名称,则还可以为伴随对象提供一个明确的名称,如下所示:
class Foo {
companion object Blah {
fun a() : Int = 1;
}
}
它可以让您以相同的方式从Kotlin调用它。在JAVA中可以用Foo.Blah.a()在
Java中调用它(这个调用方法在Kotlin中也可以使用)。
第二种回答
A.旧的Java方式:
- 声明
companion object
以包含静态方法/变量class Foo{ companion object { fun foo() = println("Foo") val bar ="bar" } }
- 调用 :
Foo.foo() // Outputs Foo println(Foo.bar) // Outputs bar
B.新的Kotlin(科特林)方式
- 直接在文件上声明,而无需在
.kt
文件上声明类。fun foo() = println("Foo") val bar ="bar"
- 使用
methods/variables
及其名称。 (导入后)采用 :foo() // Outputs Foo println(bar) // Outputs bar
参考资料