我刚刚开始使用Kotlin编程语言,它比Java更酷。我对静态方法和字段有一些疑问:
Q1:官方文件说
Kotlin还可以为named中定义的函数生成静态方法 对象或伴随对象,如果您将这些函数注释为 @JvmStatic。
但如果您在下面看到我可以访问bar()
方法作为静态方法,它可以在不使用@JvmStatic
注释的情况下工作。但在官方文件中它的投掷错误 - > Kotlin static method
Class C{
companion object{
@JvmStatic
fun foo() { }
fun bar();
}
}
fun main(args: Array<String>) {
C.foo();
C.bar(); //this line works fine
}
Q2:我真的需要@JvmStatic
和@JvmField
让事情变得不稳定吗?
正如您在companion
对象中看到的那样,事情正在按预期工作。
答案 0 :(得分:8)
您可以在Kotlin 中访问companion object
的{{1}} 成员,但不能使用Java。如果没有C.bar()
,则需要在Java中使用@JvmStatic
,就像在文档中所述。
请注意,如果没有C.Companion.bar()
,该函数将被编译为在Java中@JvmStatic
上调用的实例(非静态)方法(而Kotlin只是简化为{{1}上的调用但是,它是相同的,所以是的,您需要C.Companion
和C
在伴侣对象中进行声明编译成静态成员。
基本上,@JvmStatic
和@JvmField
是Java互操作的工具,有助于创建Java友好的API,如果您不需要从Java调用Kotlin成员(例如,它们是在您的Kotlin项目内部,或者您正在开发一个不太可能与Java一起使用的库),您可以将它们保留原样。
答案 1 :(得分:2)
是的,你确实需要include
。您在文档代码中将其称为在Kotlin 中的代码问题在Java 中称为。
更准确地说,这段代码不会编译:
snippets/fastcgi-php.conf
Kotlin知道include fastcgi_params;
中的函数,所以你可以直接在类上调用它,而Java对它一无所知。因此,您使用@JvmStatic
注释任何函数,并且它从Java代码中变为可见的静态方法。
只是为了澄清 - public void main(String[] args) {
C.foo(); // Ok
C.bar(); // Not ok
}
的目的是与Java代码互操作。如果您在Kotlin中编写应用程序,则根本不需要companion object
。
答案 2 :(得分:0)
文档(&#34;第2页和第34页;)是指从Java调用函数的情况,而不是Kotlin。
当您只使用Kotlin时,不需要注释。而是使用您声明bar()方法的方式。所以你可以致电C.bar()