Kotlin中MyClass类何时存在?伴生对象调用相关技术疑问
关于Kotlin伴生对象与类加载的疑问解答
嘿,这个问题问到点子上了!很多刚接触Kotlin伴生对象的开发者都会有类似的困惑,我来一步步给你讲明白:
为什么不需要先有MyClass实例就能调用create()?
你看到的create()方法并不是MyClass实例的方法,而是属于MyClass的**伴生对象(Companion Object)**的方法。
在Kotlin里,伴生对象是和类绑定在一起的——它属于类本身,而不是类的任何一个实例。当类被加载时,伴生对象就会被初始化,不需要先创建类的实例就能访问它的成员。你代码里的MyClass.create()其实是MyClass.Factory.create()的简写(Kotlin允许省略伴生对象的名称,直接用类名访问),本质是调用伴生对象Factory的方法,自然不需要提前创建MyClass的实例。
MyClass类究竟在何时产生?
在JVM环境下(Kotlin最终会编译成字节码跑在JVM上),类是懒加载的:当第一次触发类的使用时(比如第一次访问它的伴生对象、第一次创建它的实例、第一次引用它的静态成员等),JVM才会加载这个类,完成类的初始化工作(包括初始化伴生对象)。
回到你的代码,当执行val instance = MyClass.create()这一行时:
- JVM发现要访问MyClass的伴生对象,于是先加载MyClass类
- 初始化MyClass的伴生对象Factory
- 调用Factory里的
create()方法,在这个方法内部创建并返回MyClass的实例 - 最后把这个实例赋值给
instance变量
简单来说,类的加载发生在你第一次“用到它”的时候,而伴生对象的存在让你可以通过类名直接调用方法,不需要先实例化类。
内容的提问来源于stack exchange,提问作者vyi
相关产品推荐
相关产品推荐

