Java静态方法对应kotlin的三种写法

651 阅读2分钟

0.前言

在java中static是属于类的,不属于对象。kotlin取消了static,日常使用中替换为object 和 伴生对象。可能是为了体现万物皆对象? 但是又搞出一个包级函数 有点矛盾熬。

1.包级函数(顶层函数)

kotlin的函数和变量可以直接定义在文件中,而不是必须声明在类中。

  1. 创建一个kt文件

Untitled.png

  1. 在文件中直接函数和变量

Untitled 1.png 3.在代码中直接调用。 导入的是方法名

import com.test.demo.utils.toast

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
		toast(this,"hello world")
}

4.java中调用。与静态方法调用方式一直,文件名后面多了Kt。

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    UtilsKt.toast(this,"java");
}

5.通过 @file:JvmName("Utils") 可以修改在java中调用kotlin包级函数的文件名。但是一般情况下不修改,在看一些源码的时候 很常见xxxKt结尾的调用方式。

@file:JvmName("Utils")

package com.test.demo.utils

import android.content.Context
import android.widget.Toast

var toastDuration:Int = Toast.LENGTH_SHORT

fun toast(context: Context?, content: String) {
    Toast.makeText(context, content, toastDuration).show()
}

---------------------------------------------------------------------

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Utils.toast(this,"java");
}

2.object类

  1. kotlin中可以通过object关键字直接创建一个单例类。 通过类名.方法名调用
object ToastUtils {

    fun toast(context: Context?, content: String,duration:Int = Toast.LENGTH_SHORT) {
        Toast.makeText(context, content, duration).show()
    }
}

ToastUtils.toast(this,"kotlin调用")

  1. java调用
    1. java无法使用 kotlin中函数默认值的特性。所以三个参数全部都要传
    2. 当kotlin函数存在参数默认值时,可以在函数上标记注解 @JvmOverloads 实现java方法重载效果
//标记@JvmOverloads调用
ToastUtils.INSTANCE.toast(this,"java调用", Toast.LENGTH_SHORT);

//标记后
@JvmOverloads
fun toast(context: Context?, content: String,duration:Int = Toast.LENGTH_SHORT) {
     Toast.makeText(context, content, duration).show()
}

ToastUtils.INSTANCE.toast(this,"java调用");
ToastUtils.INSTANCE.toast(this,"java调用", Toast.LENGTH_LONG);
  1. 生成真正的静态函数@JvmStatic。只能标记在Object类 和 伴生对象

3.伴生对象

  1. 通过companion object{} 声明
class ToastUtils{
    companion object{
        fun toast(context: Context?, content: String) {
            Toast.makeText(context, content,toastDuration).show()
        }
    }
}

ToastUtils.toast(this,"kotlin调用")

  1. java调用
ToastUtils.Companion.toast(this,"java调用",Toast.LENGTH_SHORT);
  1. 生成真正的静态函数@JvmStatic。只能标记在Object类 和 伴生对象