您将功能放置在 “伴侣对象” 中。
所以像这样的 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批注或命名您的伴侣类。
从文档:
伴侣对象
类内的对象声明可以用伴随关键字标记:
class MyClass { companion object Factory { fun create(): MyClass = MyClass() } }可以通过仅使用类名作为限定符来调用伴随对象的成员:
val instance = MyClass.create()...
@JvmStatic批注,则可以将伴随对象的成员生成为实际的静态方法和字段。有关更多详细信息,请参见 Java 互操作性部分。
添加@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 调用它,但可以从Foo.Blah.a()类的 Java 中调用它(在 Kotlin 中也可以使用)。
Docs建议使用包级功能解决静态功能的大多数需求。它们只是在源代码文件中的类外部声明。可以使用 package 关键字在文件的开头指定文件的软件包。
宣言
package foo
fun bar() = {}用法
import foo.bar或者
import foo.*现在,您可以使用以下命令调用该函数:
bar()或者,如果您不使用 import 关键字:
foo.bar()如果不指定软件包,则可以从根目录访问该功能。
如果您只有 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 barB. 新科特林方式
直接声明文件,而不.kt文件的类。
fun foo() = println("Foo")
val bar ="bar"将methods/variables与它们的名称一起使用。 (导入后)
用 :
foo()        // Outputs Foo          
println(bar) // Outputs bar