kotlin如何写类似java的静态方法

kotlin如果想实现类似java的静态方法有两种:
第一种方法:是直接创建一个kotlin文件,然后直接创建一个方法,代码如下
在这里插入图片描述
然后在主函数直接调用

fun main(array: Array<String>) {
 	//直接调用上述fang
 	staticMethod()
}

第二种方式:通过伴生对象,伴生对象一个类只能写一个,代码如下

class StaticClass private constructor(val value: Double) {
	// companion object {}就是这个类的伴生对象
    companion object {
    	//TAG就相当于java的静态属性
        val TAG="StaticClass"
		//类似java的静态对象,有返回值
        fun ofDouble(double: Double): StaticClass {
            return StaticClass(double)
        }
		//类似java的静态对象,无返回值
        fun getStaticMethod() {
            println("调用了StaticClass里的getStaticMethod方法")
        }
    }
}

//具体调用
fun main(array: Array<String>) {
 var staticClass = StaticClass.ofDouble(2.0)
    StaticClass.getStaticMethod()
    println(StaticClass.TAG)
}

但是上述方法在和java混合开发中,在java中调用上面静态方法就会有一个问题,如下

public static void main(String[] args){
        //调用这个静态方法得通过Companion调用,写法感觉有点累赘
        StaticClass.Companion.getStaticMethod();
        StaticClass.Companion.ofDouble(2.0);
 }

当然也有办法解决,就是在静态方法和静态属性上面增加 @JvmStatic关键字

class StaticClass private constructor(val value: Double) {
    companion object {
        @JvmField
        val TAG="StaticClass"

        @JvmStatic
        fun ofDouble(double: Double): StaticClass {
            return StaticClass(double)
        }
        
        @JvmStatic
        fun getStaticMethod() {
            println("调用了StaticClass里的getStaticMethod方法")
        }
    }
}

还有人说通过object关键字也可以实现类似静态方法,其实不是,object其实是声明创建类似java的单例模式

//object其实是声明创建该类为单例
object ObjectClass {
    fun getObject() {
        println("调用了getObject")
    }
}

//主函数调用
fun main(array: Array<String>) {
 var staticClass = StaticClass.ofDouble(2.0)
    ObjectClass.getObject()
}

posted @ 2019-08-28 11:23  我的网名  阅读(76)  评论(0)    收藏  举报