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

标签 android kotlin

正如我们所知,要声明变量 static ,我们必须使用伴生对象

下面列出了一个简单的示例。

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();
      }
   }
}

关于android - Kotlin 中的静态变量仍然是实例对象的一部分吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47122955/

相关文章:

java - 如何在选项卡中使用 Parse.com 列表?

android - 使用 WorkManager 更新 Room 中的数据库条目

types - Kotlin赋值运算符重载和类型转换

java - Kotlin 不识别 Java 保留关键字

android - 将外部Sqlite与SimpleCursorAdapter一起使用时应用崩溃

android - 不支持网址编码

java - 使用 asmack for android 在 XMPP 数据包中的消息标记中添加自定义属性?

android - SurfaceView onMeasure() 没有调用setMeasuredDimension() 设置测量维度

kotlin - 为什么 Intellij 不为新的 kotlin 项目创建 build.gradle.kts?

android - Kotlin - 另一个对象(不是类)内的伴随对象的任何替代品?