kotlin真的没有静态成员变量的吗?

kotlin是如何改造静态成员变量与静态方法的?

在java中,定义一个静态成员变量用static关键字即可。静态成员变量属于类和类的所有实例,当类被继承后,子类也出现了相同的静态成员变量,此时相同名称的静态变量使用起来就很是尴尬了。你要非常小心的考虑继承关系和静态成员变量所在的位置。
为了避免这种混乱的问题,kotlin提出了伴生对象的概念。简单来说,一个类与生俱来的就存在一些实例。这些实例拥有类的所有方法同时还有自己独特的变量和方法。

kotlin类中代码

class KClass {
    val name = "kkk"
    companion object {
        val size = 15
    }
}

Java类中调用kotlin

public class JClass {
    public static void main(String[] args) {
        // name无法通过类进行访问
        // KClass.name
        // name可以通过一个对象进行访问
        KClass k = new KClass();
        k.name; // 可以访问

        // size通过类也不能访问
        // KClass.size
        // size通过一个对象也不能访问
        // k.size; //size不是成员变量,不属于KClass
        // companion object是伴声对象,类似于java中静态变量的概念
        KClass.Companion.size; // 可以访问到该变量
    }
}

那么问题来了,java中serialVersionUID必须是类的静态成员变量才有意义

在java中的一些基本规则必须要用到静态成员变量,比如类进行序列化Serializable的基本规则,就用到了一个类的静态成员变量,该怎么办呢?

kotlin的伴生对象的成员变量加关键字const

class KClass {
    companion object {
       private const val serialVersionUID = 110L
    }
}

好了,此时的serialVersionUID就是java中的static一样的东西了。
类似于

static final long serialVersionUID = 42L;

最后:kotlin为了支持java等语言的混合开发,有些不少特殊地方,使用过程中必须小心。新生事物都这样嘛

    原文作者:ReadyShow
    原文地址: https://www.jianshu.com/p/8bf0a3fdac38
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞