当前位置:网站首页>Kotlin - 静态方法
Kotlin - 静态方法
2022-08-02 03:27:00 【m0_63970488】
在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()的写法来调用了。
边栏推荐
猜你喜欢

hackmyvm-random walkthrough

借贷记账法下的账户结构、借贷记账法的记账规则、借贷记账法下的账户对应关系与会计分录

PHP反序列化漏洞

Microsoft Office安装全过程记录

Phonebook

Smart Tips for Frida Scripting in Kali Environment

Laravel打印执行的SQL语句

ES6 array extension methods map, filter, reduce, fill and array traversal for…in for…of arr.forEach

会计凭证概述、原始凭证、原始凭证的种类、原始凭证的基本内容、原始凭证的填制要求、原始凭证的审核

laravel-admin FROM表单同行展示问题
随机推荐
The CTF introductory notes of SQL injection
清理c盘爆满告急,C盘清理
Laravel随笔记录
uniapp | Problems with the use of the official map component
hackmyvm: may walkthrough
redis未授权访问(4-unacc)
CTF入门笔记之SQL注入
hackmyvm: kitty walkthrough
【一句话攻略】彻底理解JS中的回调(Callback)函数
pytorch:保存和加载模型
SQL注入(6)
阿里技术官手码12W字面试小册
ES6 three-dot operator, array method, string extension method
Eric target penetration test complete tutorial
laravel 写api接口时 session获取不到处理办法
Masashi: 1 vulnhub walkthrough
英语每日打卡
(7) superficial "crawlers" process (concept + practice)
WeChat applet development video loading: [Rendering layer network layer error] Failed to load media
Larave 自定义公共函数以及引入使用