问下 kotlin 中的继承问题

2022-01-15 21:48:21 +08:00
 swhoro

在 android 学习中,学习 activity 返回获取结果,有这样的代码

override fun onActivityResult(
        requestCode: Int,
        resultCode: Int,
        data: Intent?
    ) {
        super.onActivityResult(requestCode, resultCode, data)
        when (requestCode) {
            1 -> if (resultCode == RESULT_OK) {
                val returnedData = data?.getStringExtra("data_return")
                Log.d("FirstActivity", "returned data is $returnedData")
            }
        }
    }

在 result = RESULT_OK 中,RESULT_OK 是定义在 android.app.activity ,且为 public static final 修饰。 我自定义类为 FirstActivity (也是重写的 onActivityResult 所在的类),继承自 AppCompatActivity ,而 AppCompatActivity 是从 android.app.activity 一路继承下来的,那我的理解就是我自己定义的 FirstActivity 也有 RESULT_OK 这个常量。那么按理来说应该这个语句可以写为:

result = AppCompatActivity.RESULT_OK

result = FirstActivity.RESULT_OK

但是实际上只有result = AppCompatActivity.RESULT_OK不报错(但是会显示为灰色,估计意思是写 AppCompatActivity 是多余的),而result = FirstActivity.RESULT_OK报错

就想问 FirstActivity 应该也继承了 RESULT_OK ,为什么会报错呢

详细问题: https://segmentfault.com/q/1010000041289012

1057 次点击
所在节点    问与答
11 条回复
Newyorkcity
2022-01-15 21:57:38 +08:00
Java 里静态字段是不会被继承到子类。的吧。。
swhoro
2022-01-15 22:05:06 +08:00
@Newyorkcity 可以看一下我详细问题中的倒数第二张图,Student 正常访问了 Person 的 description 字段
WebKit
2022-01-16 02:29:34 +08:00
static 修饰的变量和方法是属于类本身的,不会被继承。但是是可以正常访问的。
mxalbert1996
2022-01-16 10:53:29 +08:00
Java 的这个特性与其说是继承不如说只是一个语法糖而已。如果这个 static field 是一个对象,和继承不同,所有子类访问到的都是同一个对象。
Kotlin 语言本身并不存在 static 这个概念( static 语义是通过 companion object 实现的),所以如果在 Kotlin 里允许这种写法的话就会很奇怪,因为不同类的 companion object 之间并没有继承关系。
swhoro
2022-01-16 11:41:19 +08:00
@mxalbert1996
@WebKit
那要怎么解释 result == AppCompatActivity.RESULT_OK 是正确的呢
AppCompatActivity 类是从 android.app.activity 一路继承下来的,RESULT_OK 是在 android.app.activity 定义的(把鼠标移到 RESULT_OK 上显示定义的类是这个),而我的 FirstActivity 是从 AppCompatActivity 继承下来的
那 result == AppCompatActivity.RESULT_OK 是正确的话我的 result == FirstActivity.RESULT_OK 应该也是正确的?
mxalbert1996
2022-01-16 15:34:29 +08:00
@swhoro 因为 AppCompatActivity 是 Java 类
swhoro
2022-01-16 16:36:11 +08:00
@mxalbert1996 也就是说由于 kotlin 和 java 语言的的差异,导致我的 firstactivity 无法访问 RESULT_OK 这个字段这个意思吗?
感觉 kotlin 引入之后变得好复杂了呀...
swhoro
2022-01-16 17:15:07 +08:00
@mxalbert1996 谢谢,用 java 重写逻辑之后发现 FirstActivity.RESULT_OK AppCompatActivity.RESULT_OK 这些都是正确的写法
看来 kotlin 与 java 区别还挺大的,还得再认真学一学
WebKit
2022-01-16 20:01:48 +08:00
@swhoro 其实没啥区别。日常使用直接写 Activity.RESULT_OK 就好了。
WebKit
2022-01-16 20:03:38 +08:00
另外 onActivityResult 这个方法也已经过时了,还是用新的比较好
swhoro
2022-01-16 22:08:14 +08:00
@WebKit 新手,跟着书学的,以后再看看新方法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/828491

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX