0.前言
在java中static是属于类的,不属于对象。kotlin取消了static,日常使用中替换为object 和 伴生对象。可能是为了体现万物皆对象? 但是又搞出一个包级函数 有点矛盾熬。
1.包级函数(顶层函数)
kotlin的函数和变量可以直接定义在文件中,而不是必须声明在类中。
- 创建一个kt文件
- 在文件中直接函数和变量
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类
- 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调用")
- java调用
- java无法使用 kotlin中函数默认值的特性。所以三个参数全部都要传
- 当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);
- 生成真正的静态函数@JvmStatic。只能标记在Object类 和 伴生对象
3.伴生对象
- 通过
companion object{}声明
class ToastUtils{
companion object{
fun toast(context: Context?, content: String) {
Toast.makeText(context, content,toastDuration).show()
}
}
}
ToastUtils.toast(this,"kotlin调用")
- java调用
ToastUtils.Companion.toast(this,"java调用",Toast.LENGTH_SHORT);
- 生成真正的静态函数@JvmStatic。只能标记在Object类 和 伴生对象