Kotlin之object关键字和@JvmStatic注解

说一些题外话。随着对kotlin原理的认识,个人感觉是kotlin从概念上来说是对java语法的一种包装和优化,我们知道kotlin也是属于jvm语言,最终也是需要编译成java字节码的,把kotlin对应的字节码翻译成java源码,发现还是java语法的那些东西,kotlin只是把这些东西封装了,对外提供“接口”方便客户端程序员使用,只不过这种封装是编译器层面支持的。

object是kotlin的关键字,在java中是没有。这块知识的学习看Kotlin学习系列之:object关键字的使用场景,讲的很好,这里我只出一些个人的理解。

在java中我们要想拥有一个对象,必须new一个类,但是在kotlin语法层面却不用,好像对象是独立存在的。

        val obj = object {
            fun a() {
                println("a invoked")
            }
        }

obj对象,我们知道编译器处理,也是从一个类new出来的,我估计编译器会给类起一个类名,然后new出obj对象。

在kotlin中没有static关键字,java中类方法在kotlin中有多种替代方式:

  • 对象声明的命名对象的函数上用@JvmStatic注解,这样就会在类中生成一个静态函数,当然是在字节码层面体现的
  • 在伴生对象的函数上注解@JvmStatic,这样会在外围类(封闭类)中生成一个同名的静态函数
  • 使用包级别函数,也叫顶级函数(top level function)。其实编译成字节码,也是一个static函数。
    其实,如果不是非要用static函数实现需求,对象声明定义的命名对象中的函数和伴生对象函数也能实现一样的功能,不需要@JvmStatic

伴生对象(companion object)和对象表达式(object expression)其实都是java中的内部类,伴生对象对应的是静态内部类,对象表达式对应的匿名内部类。在java匿名内部类和局部内部类中有个很重要的知识点是,这些内部类中访问的外部局部变量必须是final的,原因看参考文章;在kotlin中这点有些变化,在对象表达式生成的对象内部可以访问var声明的局部变量而且可以修改值,访问val声明的局部变量,和java一样。

参考

Kotlin学习系列之:object关键字的使用场景
kotlin 中 @JvmStatic 注解的作用
深入理解final在Java和Android中修饰局部变量的意义
Kotlin中val和var的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值