安卓 kotlin 开发中的RESULT_OK继承问题

swhoro
  • 16

初学者,在学习安卓开发中,目前java和kotlin也是一起学的状态
用的是《第一行android代码》第三版和廖雪峰的教程
在启动一个新的activity后,返回之前的activity并接受消息的代码是这样的:
image.png
在resultCode == RESULT_OK中,RESULT_OK是定义在android.app.activity,且为public static final修饰
我自定义类为FirstActivity,继承自AppCompatActivity,而AppCompatActivity是从android.app.activity一路继承下来的,那我的理解就是我自己定义的FirstActivity也有RESULT_OK这个常量
那么按理来说应该这个语句可以写为:resultCode == this.RESULT_OK
但是会报错
image.png
请问这是什么原因
另外问问有没有其他的安卓教程推荐的


补充信息:
用java试写类似逻辑:
image.png
用FirstActivity.RESULT_OK的写法:
image.png

回复
阅读 906
1 个回答

Kotlincn.net:对象表达式与对象声明

伴生对象的成员可通过只使用类名作为限定符来调用。

请注意,即使伴生对象的成员看起来像其他语言的静态成员,在运行时他们仍然是真实对象的实例成员,而且,例如还可以实现接口

腾讯云:Kotlin 类声明与伴生对象(companion)

companion object 的出现是为了解决 Java static 方法的反面向对象(Anti-OOP)的问题。static 方法无法声明为接口,无法被重写——用更学术的话来说,static 方法没有面向对象的消息传递和延迟绑定特性[参考]。而 Scala 为了完成一切皆对象的使命,以及提高与 Java 的兼容性,提出了伴生对象这个概念来代替 static 方法。随后出身的 Kotlin 也借鉴了这个概念。

companion 伴生对象是一个对象,它在类初始化时被实例化。 因为伴生对象不再是类的 static 方法,而是某个类的实例化对象,所以它可以声明接口,里面的方法也可以被重写,具备面向对象的所有特点。

示例代码:

open class Test {
    companion object {
        const val OK = -1

        fun ok(){}
    }
}

反编译代码:

public class Test {
   public static final int OK = -1;

   @NotNull
   public static final Test.Companion Companion = new Test.Companion((DefaultConstructorMarker)null);

   ...
   public static final class Companion {
      public final void ok() {
      }

      private Companion() {
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

Kotlin中,可以这样调用:Test.Companion.OKTest.Companion.ok(),只是IDE会提示:Redundant Companion reference

宣传栏