2022一晃而过,2023悄然而至,有天晚上看第一行代码(第三版)的时候,又看到了Kotlin中静态方法的几种使用方式,蹭着过年还有一些时间,写了个Demo简单测试记录一下
在 Kotlin 中使用静态的方式不止一种,嗯... 大约有3 - 4种,具体采用哪种方式,还需要自己根据场景选择了~
- Java 基础认知
- 常规方法
- 静态方法
- Kotlin 静态变量、常量、函数
- 单例 Object
- 伴生 companion object
- 顶层类、顶层方法
- 注解 @JvmStatic、@JvmField
在 Java
中 工具类
或 管理常量
,我们都会使用static
静态修饰,这样做主要是为了调用方便
Java 基础认知
主要分为 常规使用
和 静态使用
,方便初入门的人补充下基础(os:现在还有新人么...
)
常规方法
package com.example.ktobject;
public class JavaUtil {
public void doSomething() {
System.out.println("2023希望我们都更好,加油");
}
}
常规调用(需要先创建实体类,然后才可以调用内部方法)
package com.example.ktobject
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class 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.ktobject
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class 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.ktobject
class KtUtil {
fun doSomething() {
println("2023希望我们都更好,加油")
}
}
如果调用的话也需要创建实例后调用方法
package com.example.ktobject
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class 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.ktobject
object KtUtil {
fun doSomething() {
println("2023希望我们都更好,加油")
}
}
调用方式
package com.example.ktobject
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class 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.ktobject
class KtUtil {
fun doAnything() {
println("普通方法,不支持类名.调用")
}
companion object {
fun doSomething() {
println("2023希望我们都更好,加油")
}
}
}
调用方式
package com.example.ktobject
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class 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.ktobject
fun doSomething() {
println("2023希望我们都更好,加油")
}
调用稍有不同,无需通过 类名.方法,可直接调用方法(这就是所谓的顶层方法)
package com.example.ktobject
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
doSomething()
}
}
图示
注解 @JvmStatic、@JvmField
我们使用 @JvmStatic 注解静态方法,使用@JvmField 注解静态参数(变量、常量)
- 原始
object
方式并不支持Java通过静态方式调用Kt静态方法
,需要在方法上加@JvmStatic
才能支持调用
package com.example.ktobject
object KtUtil {
@JvmField
var anyBoy:String ="2023希望我们都更好,加油"
@JvmStatic
fun doSomething() {
println("2023希望我们都更好,加油")
}
}
- 原始
companion object
方式并不支持Java通过静态方式调用Kt静态方法
,需要在方法上加@JvmStatic
才能支持调用
package com.example.ktobject
class KtUtil {
@JvmField
var anyBoy:String ="2023希望我们都更好,加油"
fun doAnything() {
println("普通方法,不支持类名.调用")
}
companion object {
@JvmStatic
fun doSomething() {
println("2023希望我们都更好,加油")
}
}
}
加对应的 @JvmField
、 @JvmStatic
注解后,Java 可正常调 Kotlin 变量、方法等