Java允许通过它的孩子来访问Kotlin的基本变量,但不是Kotlin,为什么?

我有一个类如下

open class KotlinBase { companion object { const val TAG = "testing" } } 

和它的一个孩子一样

 class KotlinChild : KotlinBase() 

当我尝试从Java类访问TAG时,我也可以

 public class JavaOther { String test1 = KotlinBase.TAG; // This is okay String test2 = KotlinChild.TAG; // This is okay } 

但是,从Kotlin课程访问时,我无法通过Child访问。

 class KotlinOther { val test1 = KotlinChild.TAG // Compile/Syntax error val test2 = KotlinBase.TAG // This is okay } 

为什么我的Kotlin类不能通过KotlinChild访问继承的变量TAG

这是一个设计决定,可以避免含糊不清。 – 子类可以拥有自己的companion object ,其字段/方法与父类中的名称相同。

通过仅通过实际类限制对同伴的访问,不存在模糊字段/方法遮蔽的问题。

此外,伴侣对象不是从其他语言中已知的static成员。 尽管大部分用例重叠。

另外,请记住

 KotlinBase.TAG 

是一个捷径:

 KotlinBase.Companion.TAG