V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
swhoro
V2EX  ›  问与答

问下 kotlin 中的继承问题

  •  
  •   swhoro · 2022-01-15 21:48:21 +08:00 · 1061 次点击
    这是一个创建于 1048 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 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

    11 条回复    2022-01-16 22:08:14 +08:00
    Newyorkcity
        1
    Newyorkcity  
       2022-01-15 21:57:38 +08:00
    Java 里静态字段是不会被继承到子类。的吧。。
    swhoro
        2
    swhoro  
    OP
       2022-01-15 22:05:06 +08:00
    @Newyorkcity 可以看一下我详细问题中的倒数第二张图,Student 正常访问了 Person 的 description 字段
    WebKit
        3
    WebKit  
       2022-01-16 02:29:34 +08:00 via Android
    static 修饰的变量和方法是属于类本身的,不会被继承。但是是可以正常访问的。
    mxalbert1996
        4
    mxalbert1996  
       2022-01-16 10:53:29 +08:00 via Android
    Java 的这个特性与其说是继承不如说只是一个语法糖而已。如果这个 static field 是一个对象,和继承不同,所有子类访问到的都是同一个对象。
    Kotlin 语言本身并不存在 static 这个概念( static 语义是通过 companion object 实现的),所以如果在 Kotlin 里允许这种写法的话就会很奇怪,因为不同类的 companion object 之间并没有继承关系。
    swhoro
        5
    swhoro  
    OP
       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
        6
    mxalbert1996  
       2022-01-16 15:34:29 +08:00 via Android
    @swhoro 因为 AppCompatActivity 是 Java 类
    swhoro
        7
    swhoro  
    OP
       2022-01-16 16:36:11 +08:00
    @mxalbert1996 也就是说由于 kotlin 和 java 语言的的差异,导致我的 firstactivity 无法访问 RESULT_OK 这个字段这个意思吗?
    感觉 kotlin 引入之后变得好复杂了呀...
    swhoro
        8
    swhoro  
    OP
       2022-01-16 17:15:07 +08:00
    @mxalbert1996 谢谢,用 java 重写逻辑之后发现 FirstActivity.RESULT_OK AppCompatActivity.RESULT_OK 这些都是正确的写法
    看来 kotlin 与 java 区别还挺大的,还得再认真学一学
    WebKit
        9
    WebKit  
       2022-01-16 20:01:48 +08:00 via Android
    @swhoro 其实没啥区别。日常使用直接写 Activity.RESULT_OK 就好了。
    WebKit
        10
    WebKit  
       2022-01-16 20:03:38 +08:00 via Android
    另外 onActivityResult 这个方法也已经过时了,还是用新的比较好
    swhoro
        11
    swhoro  
    OP
       2022-01-16 22:08:14 +08:00
    @WebKit 新手,跟着书学的,以后再看看新方法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2852 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:54 · PVG 20:54 · LAX 04:54 · JFK 07:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.