Kotlin 里面没有 static 方法的概念,它通过 object 声明单例对象的方法来让你使用 static 的代码。 比如:

    1. object Boy {
    2. fun next() {
    3. println("构建单例测试")
    4. }
    5. }

    这个 Boy.next() 就是一个静态的方法。 Kotlin 通过将他编译为一个单例对象的方式来实现静态。 这段代码放在 Java 里就需要这样调用:

    public static void main(String[] args) {
        //需要多出一个INSTANCE
        Boy.INSTANCE.next();
    }
    

    于是为了保证java项目中简洁引用Kotlin定义的单例类,因此多出了@JvmStatic 注解,这样Kotlin编译器就会再生成一个静态方法,从而减少了INSTANCE的调用

    object Boy {
        @JvmStatic // 这个 annotation 是修饰在方法上的
        fun next() {
            println("构建单例测试")
        }
    }
    

    如果没有 companion 关键字,编译器默认生成 INSTANCE实例,如果有则是 COMPANION实例 如下:

    class SomeClass {
        companion object {
            @JvmStatic
            fun someMethod() = Unit
        }
    }
    

    java调用:

    class JavaClass {
        public static void main(String[] args) {
            // 加上 JvmStatic 之前
            SomeClass.COMPANION.someMethod()
            // 之后
            SomeClass.someMethod()
        }
    }