Kotlin静态方法的使用浅析

 更新时间:2022年08月02日 14:34:15   作者:m0_63970488  
静态方法在其他高级语言(如C++,Java)中也叫类方法。静态方法在调用时无需创建实例,通过类名.方法名的方式调用。在java中调用静态方法的只需在声明前面加关键字static即可。而kotlin中却比较复杂,下面我们来了解一下

在Java中定义一个静态方法非常之简单,只需要在方法上声明一个static关键字就可以了:

public class Util {
    public static void doAction(){
        System.out.println("do action");
    }
}

上述代码中doAction()方法是一个静态方法,调用静态的方法并不需要创建实例,因而静态方法非常适合用于编写一些工具类,因为工具类并没有创建实例的必要,基本都是全局通用

和绝大部分不同的是,Kotlin极度弱化了静态方法的这个概念,想要在Kotlin中定义一个静态的方法反而倒不是一件容易的事。

那么Kotlin为什么要这么设计呢,因为Kotlin提供了比静态方法更好用的语法特性,就是单例类。

像工具类这种功能,在Kotlin中直接推荐单例类的方式来实现,比如上述的Util工具类,在Kotlin中可以这么写:

object Util {
    fun doAction(){
        println("do action")
    }
}

单例类的会影响,类中所有的方法全部变成类似静态方法的调用方式,而如果我们只希望让类中的某一个方法变成静态方法调用方式可以采用如下写法:

class Util {
    fun doAction(){
        println("do action")
    }
    companion object{
        fun doAction2(){
            println("do action2")
        }
    }
}

这里在companion object 代码块中定义了一个doAction2()方法。现在Util类中的两个方法就有了本质的区别,doAction()方法一定要先创建Util类的实例才能调用,而doAction2()方法就可以直接使用Util.doAction2()的方式调用。

不过doAction2方法也不并不是静态方法,companion object 这个关键字实际上会在Util类的内部创建一个伴生类,而doAction2方法就是定义在伴生类里面的实例方法。只是Kotlin会保证Util类始终只会存在一个伴生类对象,因此调用Util.doAction2方法实际上就是调用了Util类中的伴生对象的doAction2方法

由此可见,Kotlin确实没有直接定义静态方法的关键字,但是提供了一些语法特性来支持类似于静态方法调用的写法。

如果你确确实实要定义真的静态方法吗,Kotlin仍然提供了两种实现方法,注解和顶层方法。

顶层方法这篇文章不做讲解,请查找其他文章。

来看注解,前面使用的单例类和companion object 都只是语法上模仿了静态方法的调用方式,如果你在java代码中以静态方法的形式去调用的话,你会发现,这些方法并不存在。而如果我们给单例类或者companion object 中的方法加上 @JvmStatic 注解,那么Kotlin在编译器就会将这些方法编译成真正的静态方法

class Util {
    fun doAction(){
        println("do action")
    }
    companion object{
        @JvmStatic
        fun doAction2(){
            println("do action2")
        }
    }
}

注意,@JvmStatic 注解只能加载单例类或companion object中的方法上,如果尝试添加到普通方法上,会直接提示语法错误。

这样不管是在Kotlin和Java中,都可以使用Util.doAction2()的写法来调用了。

到此这篇关于Kotlin静态方法的使用浅析的文章就介绍到这了,更多相关Kotlin静态方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android如何使用正则表达式只保留字母数字

    Android如何使用正则表达式只保留字母数字

    在做项目的过程中,使用正则表达式来匹配一段文本中的特定种类字符,是比较常用的一种方式,下面这篇文章主要给大家介绍了关于Android如何使用正则表达式只保留字母数字的相关资料,需要的朋友可以参考下
    2022-05-05
  • Android开发Dart Constructors构造函数使用技巧整理

    Android开发Dart Constructors构造函数使用技巧整理

    这篇文章主要为大家介绍了Android开发Dart Constructors构造函数使用技巧整理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Android 配置打包签名信息的两种方法

    Android 配置打包签名信息的两种方法

    这篇文章主要介绍了Android 配置打包签名信息的两种方法,非常不错,具有一定的参考借鉴加载,需要的朋友可以参考下
    2018-06-06
  • Android采取BroadcastReceiver方式自动获取验证码

    Android采取BroadcastReceiver方式自动获取验证码

    这篇文章主要介绍了Android采取BroadcastReceiver方式自动获取验证码,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android自定义dialog可选择展示年月日时间选择栏

    Android自定义dialog可选择展示年月日时间选择栏

    这篇文章主要介绍了Android自定义dialog可选择展示年月日时间选择栏,非常不错,具有参考借鉴价值,需要的的朋友参考下
    2017-03-03
  • android中SQLite使用及特点

    android中SQLite使用及特点

    SQLite是一个轻量级数据库,它设计目标是嵌入式的,而且占用资源非常低,本文重点给大家介绍android中SQLite使用及特点,感兴趣的朋友跟随小编一起看看吧
    2021-04-04
  • Android如何使用ViewPager2实现页面滑动切换效果

    Android如何使用ViewPager2实现页面滑动切换效果

    这篇文章主要给大家介绍了关于Android如何使用ViewPager2实现页面滑动切换效果的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-02-02
  • Android权限机制深入分析讲解

    Android权限机制深入分析讲解

    Android的权限管理遵循的是“最小特权原则”,即所有的Android应用程序都被赋予了最小权限。一个Android应用程序如果没有声明任何权限,就没有任何特权
    2022-12-12
  • Android开发之ProgressBar字体随着进度条的加载而滚动

    Android开发之ProgressBar字体随着进度条的加载而滚动

    这篇文章主要介绍了Android开发之ProgressBar字体随着进度条的加载而滚动,需要的朋友可以参考下
    2017-09-09
  • Android如何自定义升级对话框示例详解

    Android如何自定义升级对话框示例详解

    对话框是我们在平时经常会遇到的一个功能,但自带的对话框不够美观,大家一般都会自定义,下面这篇文章主要给大家介绍了关于Android如何自定义升级对话框的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08

最新评论