在Java被翻译成Kotlin之后,为什么属性上的修饰符与Getter和Setter相同但不是Field?

时间:2018-03-13 10:05:25

标签: kotlin

Official Ref表示默认的可见性修饰符是公开的。

但是从koan data classes可以推断出它是私人的。

这是一个矛盾吗? kotlin中属性的默认可见性修饰符是什么?

---------以上是最初的问题---------------

我没有混合属性和字段。但我确实对如何访问属性感到困惑。

为了解决我的困惑,我实际上应该在编辑过的标题中提出新问题。

下面自答答。

3 个答案:

答案 0 :(得分:5)

属性(以及函数和类,以及......)的默认可见性确实是公开的。

Koan有点令人困惑,因为Java类具有公共 getters 的私有字段。 属性可以看作是字段,getter和可选setter的组合。 Koan酒店拥有一个私人 backing field 和一个公共吸气者。

例如,如果你写

val age = person.age

然后Kotlin将基本生成getAge()类的Person方法,该方法将在内部调用。此方法返回字段本身。 也可以向该getter添加行为。您可以在documentation

中找到更多相关信息

因此,这不是一个矛盾,而是一个不同的概念。

答案 1 :(得分:2)

kotlin中属性的默认可见性修饰符是什么?

正如文档所说,它是公开的

为什么这些字段不是私有的

在此示例中,字段是不可变的,因此没有自动定义的setter。数据类自动具有getter并使用它们,但它通过不要求手动调用来简化读取代码。

工作示例

此代码:

object X {
    data class Example(val a: String, val b: String)
    @JvmStatic
    fun main(args: Array<String>) {
        val e = Example("a", "b")
        println(e.a)
        println(e.b)
    }
}

此方法的主要方法是编译(删除了检查和元数据):

public static final void main(String[] args) {
    X.Example e = new X.Example("a", "b");
    String var2 = e.getA();
    System.out.println(e.getA());
    var2 = e.getB();
    System.out.println(var2);
}

(使用IntelliJ IDEA进行反编译)

答案 2 :(得分:0)

属性封装支持字段by defintion。初始化时,支持字段直接分配 。所有访问初始化都是通过访问者完成的。

  • 因此,Kotlin 中不再需要字段中的私有修饰符
  • 关于getter和setter in Java 的公众被置于财产上(实际上,仍然是吸气者和制定者)在Kotlin

因此省略的修饰符为public而不是private