Kotlin中的静态变量仍然是实例对象的一部分

正如我们所知,声明一个变量static,我们必须使用companion object

下面列出一个简单的例子。

 class MainActivity : AppCompatActivity() { companion object { val extraMessage = "message" } } 

这可以在其他Activity中作为MainActivity.extraMessage访问,非常简洁。

但文档指出,语法看起来像它的静态,但在运行时,它们仍然是实际对象的实例成员。

所以就像Kotlin没有静态成员,或者Kotlin刚刚提供了一个更简单的方法来编写代码。

在intelliJ中,您可以使用kotlin插件反编译生成的字节码,以便查看正在发生的事情。 您的代码会生成以下代码的近似值:

 import kotlin.Metadata; import kotlin.jvm.internal.DefaultConstructorMarker; import org.jetbrains.annotations.NotNull; import android.support.v7.app.AppCompatActivity; @Metadata( mv = {1, 1, 7}, bv = {1, 0, 2}, k = 1, d1 = {"\u0000\f\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0003\u0018\u0000 \u00032\u00020\u0001:\u0001\u0003B\u0005¢\u0006\u0002\u0010\u0002¨\u0006\u0004"}, d2 = {"LMainActivity;", "Landroid/support/v7/app/AppCompatActivity;", "()V", "Companion", "special module for files not under source root"} ) public final class MainActivity extends AppCompatActivity { @NotNull private static final String extraMessage = "message"; public static final MainActivity.Companion Companion = new MainActivity.Companion((DefaultConstructorMarker)null); @Metadata( mv = {1, 1, 7}, bv = {1, 0, 2}, k = 1, d1 = {"\u0000\u0014\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0002\b\u0003\b\u0086\u0003\u0018\u00002\u00020\u0001B\u0007\b\u0002¢\u0006\u0002\u0010\u0002R\u0014\u0010\u0003\u001a\u00020\u0004X\u0086D¢\u0006\b\n\u0000\u001a\u0004\b\u0005\u0010\u0006¨\u0006\u0007"}, d2 = {"LMainActivity$Companion;", "", "()V", "extraMessage", "", "getExtraMessage", "()Ljava/lang/String;", "special module for files not under source root"} ) public static final class Companion { @NotNull public final String getExtraMessage() { return MainActivity.extraMessage; } private Companion() { } // $FF: synthetic method public Companion(DefaultConstructorMarker $constructor_marker) { this(); } } } 

为了这个答案的目的,我已经删除了扩展名,让它在纯Kotlin编译,它不应该影响答案

此代码:

 class MainActivity { companion object { val extraMessage = "message" } } 

在类文件反编译时使用这个java代码(使用http://www.javadecompilers.com/ ):

 import kotlin.Metadata; public final class MainActivity { public static final MainActivity.Companion Companion = new MainActivity.Companion(null); private static final String extraMessage = "message"; public MainActivity() {} } 

如上所示,extraMessage存储为生成类的静态字段,Kotlin允许字段的访问方式与Java中的相同。