静态方法在其他高级语言(如C++,Java)中也叫类方法。静态方法在调用时无需创建实例,通过类名.方法名
的方式调用。
在java中调用静态方法的只需在声明前面加关键字static
即可。而kotlin中却比较复杂,下面看看几种常见的应用场景。
工具类
工具类没有比较实例化,因此非常适合用静态方法实现。在kotlin中使用单例类实现类似的功能:
object Util{
fun function(){
println("这是一个工具类")
}
}
实际上这里的function
并非静态方法,但是可以用过类名.方法名
的方式调用。但是,使用单例类的缺点是所有的方法必须通过类名.方法名
的方式调用。
伴生类
如果我们想使一个普通类中的某些方法通过类名.方法名
的方式调用,而别的方法还是正常的调用方式,可以借助伴生类,即关键字companion object
class Util2{
fun function1(){
println("这是一个普通的方法")
}
companion object{
fun function2(){
println("这是伴生类中的方法")
}
}
}
这里的functio1
必须通过对象名.方法名
的方式调用,而function2
被定义在companion object
中,可以通过类名.方法名
的方式调用。
上述方法只是实现了类似于静态方法的特性,而并非真的静态方法。因为在java文件中以静态方法的形式调用的时候,发现这些方法都不存在的。
真正的静态函数
@JvmStatic注解
如果给单例类(object
)和伴生类中(companion object
)的方法加上@JvmStatic
注解,就会成为真正的静态方法,在kotlin和java文件中都可以调用。
注意:@JvmStatic
只能加在单例类和伴生类中的对象上。如果加在一个普通方法上,就会报错。
class Util3 {
companion object{
@JvmStatic
fun function(){
println("这是一个真正的静态方法")
}
}
}
顶层方法
顶层方法是指那些没有不在类中定义的方法。编译器会自动把所有的顶层方法全部编译成静态方法。
如果在kotlin中调用顶层方法,直接使用函数名即可。
然而java是纯面向对象的,所有的方法必须都定义在类中,没有顶层方法这个概念。编译器会将定义顶层方法的kotlin文件名自动编译成一个java类,通过这个类就可以调用了。
总结:静态方法最好的使用方式是在伴生类前面加上@JvmStatic
注释。