2022一晃而过,2023悄然而至,有天晚上看第一行代码(第三版)的时候,又看到了Kotlin中静态方法的几种使用方式,蹭着过年还有一些时间,写了个Demo简单测试记录一下
在 Kotlin 中使用静态的方式不止一种,嗯... 大约有3 - 4种,具体采用哪种方式,还需要自己根据场景选择了~
在 Java
中 工具类
或 管理常量
,我们都会使用static
静态修饰,这样做主要是为了调用方便
Java 基础认知
主要分为 常规使用
和 静态使用
,方便初入门的人补充下基础(os:现在还有新人么...
)
常规方法
package com.example.ktobject;public class JavaUtil { public void doSomething() { System.out.println("2023希望我们都更好,加油"); }}
常规调用(需要先创建实体类,然后才可以调用内部方法)
package com.example.ktobjectimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleclass MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) var javaUtil = JavaUtil() javaUtil.doSomething() }}
静态方法
package com.example.ktobject;public class JavaUtil { public static String anyBoy = "2023希望我们都更好,加油"; public static void doSomething() { System.out.println("2023希望我们都更好,加油"); }}
静态调用
package com.example.ktobjectimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleclass MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)//静态变量var anyBoy = JavaUtil.anyBoy//静态方法 JavaUtil.doSomething() }}
Kotlin 静态变量、常量、函数
关于静态变量、常量、函数(方法)在Kotlin的使用,主要有Object、companion object、顶层方法、 @JvmStatic注解、@JvmField注解等方式
其中 静态变量、常量
的内容均放在了 @JvmStatic、@JvmField注解
进行讲解
这是我创建的一个 Kt 工具类,它只是一个普通类
package com.example.ktobjectclass KtUtil { fun doSomething() { println("2023希望我们都更好,加油") }}
如果调用的话也需要创建实例后调用方法
package com.example.ktobjectimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleclass MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) var ktUtil = KtUtil() ktUtil.doSomething() }}
单例 Object
使用 Object
关键字修饰类
补充、扩展
- 该方式主要用到了
Kt 单例
方面的知识 不支持 Java 调用 Kt 方法
- 该方式所修饰的类,可以看做静态类,
内部方法均为静态方法(定制性弱了一点)
- 同时在
Kt
中还可以用open
、data
、internal
package com.example.ktobjectobject KtUtil { fun doSomething() { println("2023希望我们都更好,加油") }}
调用方式
package com.example.ktobjectimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleclass MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) KtUtil.doSomething() }}
图示
使用不用关键字修饰类时,As 给出的图示也不相同
- class 修饰类图
- Object 修饰类图
伴生 companion object
这儿使用 companion object
包裹方法,只有在该作用域内的方法方为静态方法
补充、扩展
- 定制性更强一些,可以定义不同方法的调用方式
- 调用
companion object
修饰时,原理是内部维护了一个伴生类
不支持 Java 调用 Kt 方法
KtUtil
package com.example.ktobjectclass KtUtil { fun doAnything() { println("普通方法,不支持类名.调用") } companion object { fun doSomething() { println("2023希望我们都更好,加油") } }}
调用方式
package com.example.ktobjectimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleclass MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //基础调用(先建实例,再调方法) KtUtil().doAnything() //静态调用 KtUtil.doSomething() }}
顶层类 顶层方法
顶层方法是指那些没有定义在任何类中的方法,Kotlin编译器会将所有顶层方法编译成静态方法
补充、扩展
- 该方式调用静态方法时
无需通过 类名.方法,可直接调用方法
支持 Java 调用 Kt 方法
- 我之前记录一个关联知识 为何Kotlin文件有的带.kt后缀,有的不带?
- 顶层方法常用在
扩展函数、扩展属性
场景
创建.Kt File三连招
- New - Kt File
- 起名 - File
- 初始内容
KtUtils
package com.example.ktobjectfun doSomething() { println("2023希望我们都更好,加油")}
调用稍有不同,无需通过 类名.方法,可直接调用方法(这就是所谓的顶层方法)
package com.example.ktobjectimport androidx.appcompat.app.AppCompatActivityimport android.os.Bundleclass MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) doSomething() }}
图示
注解 @JvmStatic、@JvmField(支持 Java 调 Kt)
我们使用 @JvmStatic 注解静态方法,使用@JvmField 注解静态参数(变量、常量)
- 原始
object
方式并不支持Java通过静态方式调用Kt静态方法
,需要在方法上加@JvmStatic
才能支持调用
package com.example.ktobjectobject KtUtil { @JvmField var anyBoy:String ="2023希望我们都更好,加油" @JvmStatic fun doSomething() { println("2023希望我们都更好,加油") }}
- 原始
companion object
方式并不支持Java通过静态方式调用Kt静态方法
,需要在方法上加@JvmStatic
才能支持调用
package com.example.ktobjectclass KtUtil { @JvmField var anyBoy:String ="2023希望我们都更好,加油" fun doAnything() { println("普通方法,不支持类名.调用") } companion object { @JvmStatic fun doSomething() { println("2023希望我们都更好,加油") } }}
加对应的 @JvmField
、 @JvmStatic
注解后,Java 可正常调 Kotlin 变量、方法等
静态常量 const
使用const
时,首先要了解 var、val
修饰变量的区别
var
可变变量,可更改val
只读变量,不可更改
注意: const 仅支持 val 只读变量!!!
const作用域
一般有以下三种
顶层方法
package com.example.ktobjectconst val anyBoy: String = "常量(只读变量):2023希望我们都更好,加油"
object
package com.example.ktobjectobject KtUtil { const val anyBoy: String = "常量(只读变量):2023希望我们都更好,加油"}
companion object
package com.example.ktobjectclass KtUtil { companion object{ const val anyBoy: String = "常量(只读变量):2023希望我们都更好,加油" }}
提示1:object、companion object 内修饰常量,可以不加const ,但是会报警告...
提示2:如果使用了const ,就不需要加 @JvmField 注解也支持Java调Kt咯
兴趣扩展 → const val
和val
修饰对象的主要区别
引用性
- 没有使用const ,在kotlin中,都是直接引用的
- 在java中,必须写全路径,通过
getter
方法获取
Kt类
Java引用
可见性
const val
可见性为public final static
,可以直接访问val
可见性为private final static
,并且val
会生成方法getNormalObject()
,通过方法调用访问
来源地址:https://blog.csdn.net/qq_20451879/article/details/128534213