<本文学习郭神《第三行代码》总结>
在Java中申明静态方法,只需要加入关键字static就可以了
public class Util{
public static void funAction(){
print("静态方法")
}
}
在上述代码中fun()就是一个静态方法,在调用该方法时,可以直接调用Util.funAction()。
但是在Kotlin中极度弱化了静态方法这个概念,Kotlin中并没有直接定义静态方法的关键字,但是提供了一些其他的语法支持这种特性。
1、单例模式
通过单例模式可以将上述代码就可以修改成:
object Util{
fun funAction(){
print("静态方法")
}
}
这里funAction并不是静态方法,但是仍然可以通过Util.funAction()调用。
2、companion object
使用单例模式会将类中所有方法全部变成类似于静态方法的调用方式,这种方法并不能满足更多需求,所以这里使用companion object。
所以,上述代码就可以修改成:
class Util{
fun funAction(){
print("static fun")
}
companion object {
fun funAction2() {
print("static fun2")
}
}
}
这里首先要将Util改成一个普通类,funAction需要实例化才能调用,funAction2可以直接调用Util.funAction2()。
但是,这里需要注意的是,funAction2并不是静态方法,companion object这个关键字只是在Util类的内部创建了一个伴生类,funAction2方法时定义在伴生类中的实例方法。所以这里直接调用,其实是调用了Util类中伴生对象的funAction2方法。
companion object只是形式上模仿了静态方法的调用方式。
3、注解
如果在单例模式或companion object中的方法加上@JVMStatic注解,那么Kotlin编译器就将会把这些方法变成真正的静态方法。
上述代码就可以修该成:
单例模式:
object Util{
@JvmStatic
fun funAction(){
print("静态方法")
}
}
companion object:
class Util{
fun funAction(){
print("static fun")
}
companion object {
@JvmStatic
fun funAction2() {
print("static fun2")
}
}
}
这里需要注意的是@JvmStatic只能加载单例类或companion object中的方法上,加在其他地方,都会提示语法错误。
4、顶层方法
顶层方法指的是那些没有定义在任何类中的方法,Kotlin会将所有的顶层方法全部编译成静态方法,因此只要定义个顶层方法,那么它就一定是静态方法。
定义顶层方法,需要新创建一个名字为Object的Kotlin文件,生成一个Object.kt文件,在这个文件中定义的任何方法都会是顶层方法。
比如:
import util.*
fun doAction1 () {
print("顶层方法1")
}
fun doAction2 () {
print("顶层方法2")
}
调用也很简单,所有的顶层方法可以直接调用,直接在需要调用出键入方法名就可以。
这是因为在创建Object.kt文件时,Kotlin编译器会自动创建一个ObjectKt的Java类,doAction1、doAction2方法就是以静态方法的形式定义在ObjectKt类里面的。因此,如果使用Java代码的话,可以直接使用ObjectKt.doAction1()调用。如果是Kotlin代码的话,可以直接输入doAction1方法名。