• Android修行手册 - 一文全了解Kotlin几种静态变量、函数实现的那些事


    👉关于作者

    专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
    有什么需要欢迎底部卡片私我,交流让学习不再孤单

    在这里插入图片描述

    👉实践过程

    在 Java 中使用静态方法或者静态变量,我们直接使用 static 进行静态修饰即可。调用起来不论是 Java 调用还是 Kotlin 调用,方式一样都很方便,类名.方法名 即可。
    但是在 Kotlin 中使用静态的方式可就不止一种,有三四种呢,而且不同的方式在 Java 中引用使用方式还不同。具体采用哪种方式,还需要自己根据场景选择了~

    😜静态方式

    关于静态变量、常量、函数(方法)在Kotlin的使用,主要有以下几种形式:Object、companion object、顶层方法、 @JvmStatic注解、@JvmField注解

    单例 Object

    使用 Object 关键字修饰class类
    该方式主要用到了 Kt 单例方面的知识
    该方式所修饰的类,可以看做静态类,内部方法均为静态方法(定制性弱了一点)
    同时在 Kt 中还可以用 open、data、internal

    object MyStatic {
        fun myFun(){}
    }
    
    //Kotlin中调用
    MyStatic.myFun()
    //Java中调用
    MyStatic.INSTANCE.myFun();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    伴生 companion object

    伴随对象,通常声明单例方式,也是最常用的方式之一。
    使用 companion object 包裹方法,只有在该作用域内的方法方为静态方法。
    调用 companion object 修饰时,原理是内部维护了一个伴生类,伴随真不是白叫的,内部维护了静态内部类来模拟static特性
    不支持 Java 直接调用 Kt 方法

    class MyStaticTwo {
        companion object {
            fun myFun() {
    
            }
        }
    }
    
    //Kotlin中调用
    MyStaticTwo.myFun()
    //Java中调用
    MyStaticTwo.Companion.myFun();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    顶层类 顶层方法

    顶层方法是指那些没有定义在任何类中的方法,Kotlin编译器会将所有顶层方法编译成静态方法,这已经脱离了Java范围
    该方式调用静态方法时无需通过 类名.方法,可直接调用方法。支持 Java 直接调用 Kt 方法

    顶层方法常用在扩展函数、扩展属性场景

    创建kt文件后,直接在里面写方法。

    package cn.jucheng.datafactoryapp
    
    fun myFun(){
    }
    //Kotlin中调用
    myFun()    //直接调用方法即可
    //Java中调用
    MyStaticKt.myFun();  //可以通过【文件名+Kt】的形式调用出来。  我创建的文件名是 MyStatic 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    注解 @JvmStatic、@JvmField(支持 Java 调 Kt)

    我们使用 @JvmStatic 注解静态方法,使用@JvmField 注解静态参数(变量、常量)

    原始 object 方式并 不支持在Java通过静态方式直接调用Kt静态方法,需要在方法上加 @JvmStatic 才能支持直接调用
    只能写在 object 修饰的类或者 companion object 里,写法虽然有些别扭,但是效果是真的是按 static 来实现的

    object MyStatic {
        @JvmField
        var myName = "芝麻粒儿"
    
        @JvmStatic
        fun myFun() {
    
        }
    }
    
    class MyStaticTwo {
        @JvmField
        var myName = "芝麻粒儿"   //这种情况无法知己诶访问
    
        companion object {
            @JvmField
            var myNameTwo = "芝麻粒儿"  
            @JvmStatic
            fun myFun() {
    
            }
        }
    }
    //Java中调用
    MyStatic.myName="";
    MyStatic.myFun();
    MyStaticTwo.myName=""; //报错 无法调用
    MyStaticTwo.myNameTwo="";
    MyStaticTwo.myFun();
    
    //Kotlin中调用
    MyStatic.myName
    MyStatic.myFun()
    MyStaticTwo.myNameTwo
    MyStaticTwo.myName  //同样无法直接调用
    MyStaticTwo.myFun()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述
    反编译后可以看出这种形式是比较贴合我们常用的Java形式的。建议@JvmField修饰变量 @JvmStatic修饰函数方法。如果他们反过来使用虽然不报错,但是反编译后会发现里面代码多了一层处理。

    静态常量 const

    在使用const前,我们要了解 var、val 修饰变量的区别:var 可变变量,可更改、val 只读变量,不可更改
    注意: const 仅支持 val 只读变量 的形式,包内唯一性,脱离类的束缚,这是kotlin的特性,不能和 @JvmField 混用
    const 关键字的作用域 一般有三种地方:顶层方法、object 、companion object
    我们写代码通常应该有个单独的object的类,里面放置的是所有的const修饰的常量,当然如果过多也可以分多个object类。
    在 Java 中可以直接调用
    在这里插入图片描述
    从上面我们可以看出静态变量是定义在类公有属性中,和Java中定义一模一样,我们在Java中定义常量也是使用 final 关键字。但 const 有两个限制:

    1. 值必须是常量,后续不可更改
    2. 必须是基本的包装类型

    😜将 Kotlin 编译成 Java

    我们都知道 kotlin 最终还是要编译成 java class 在 JVM 上运行的,有时我们的确是想看看用 kotlin 写完的代码编译完了到底啥样子,这样有助于我们理解 kotlin 语法
    比如现在想要查看具体的 Kotlin 不同静态方法具体的 Java 实现。我们直接使用 Android Studio 提供的工具即可。

    在窗口中找到 Tools->Kotlin->Show Kotlin Bytecode 打开窗口然后点击 Decompile 进行反编译即可。
    在这里插入图片描述
    快去试试吧。

    👉其他

    📢作者:小空和小芝中的小空
    📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
    📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

    温馨提示点击下方卡片获取更多意想不到的资源。
    空名先生

  • 相关阅读:
    微信小程序实验案例:简易成语小词典
    【web应用系统实践】第四章作业
    Java格式化字符串嵌入变量
    linux 安装 jdk 环境
    在Vue 3中使用v-model来构建复杂的表单
    设置npm下载源,加快组件下载
    管理类全系书单,速速码住(50本书籍全部附送!)
    C# 异步编程模式详解
    丁鹿学堂:前端面试之promise A + 规范
    前端入门学习笔记三十六
  • 原文地址:https://blog.csdn.net/qq_27489007/article/details/134188973