Official Ref表示默认的可见性修饰符是公开的。
但是从koan data classes可以推断出它是私人的。
这是一个矛盾吗? kotlin中属性的默认可见性修饰符是什么?
---------以上是最初的问题---------------
我没有混合属性和字段。但我确实对如何访问属性感到困惑。
为了解决我的困惑,我实际上应该在编辑过的标题中提出新问题。
下面自答答。
答案 0 :(得分:5)
属性(以及函数和类,以及......)的默认可见性确实是公开的。
Koan有点令人困惑,因为Java类具有公共 getters 的私有字段。 属性可以看作是字段,getter和可选setter的组合。 Koan酒店拥有一个私人 backing field 和一个公共吸气者。
例如,如果你写
val age = person.age
然后Kotlin将基本生成getAge()
类的Person
方法,该方法将在内部调用。此方法返回字段本身。
也可以向该getter添加行为。您可以在documentation。
因此,这不是一个矛盾,而是一个不同的概念。
答案 1 :(得分:2)
正如文档所说,它是公开的
在此示例中,字段是不可变的,因此没有自动定义的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。初始化时,支持字段直接分配 。所有访问除初始化都是通过访问者完成的。
因此省略的修饰符为public
而不是private
。