Java 理解Kotlin访问修饰符
我在java中有一个子类,在kotlin中有一个父类,在java中有一个SuperParent类,我在访问kotlin类的字段时有一个问题,它显示errorerror:(11,28)java:count在parent中有私有访问权代码如下:Java 理解Kotlin访问修饰符,java,kotlin,Java,Kotlin,我在java中有一个子类,在kotlin中有一个父类,在java中有一个SuperParent类,我在访问kotlin类的字段时有一个问题,它显示errorerror:(11,28)java:count在parent中有私有访问权代码如下: public class Child extends Parent { public static void main(String[] args) { Child child = new C
public class Child extends Parent {
public static void main(String[] args) {
Child child = new Child();
child.getParentCount();
}
private void getParentCount() {
**//here error comes (Error:(11, 28) java: count has private access in Parent)**
System.out.println(***count***);
}
}
open class Parent : SuperParent() {
protected var count: Int =0
init {
// but this works properly , if I remove the error in child class
println(superCount)
}
}
public class SuperParent {
protected int superCount = 5;
public SuperParent() {
// this also prints properly on removing error
System.out.println(superCount);
}
}
简短回答:在Java中,您应该能够使用
getCount()
(和setCount()
)代替count
长答覆:
这是Kotlin如何处理属性的结果
在Java中,字段(成员变量)可以有任何作用域。但在实践中,将其公开会阻止您控制如何访问或修改它们,因此通常的模式是将其保持私有并具有访问器方法(get()
,如果可写,set()
)
由于该模式非常常见且冗长,Kotlin会为您处理它。Kotlin属性看起来像字段,但(在Kotlin/JVM中)它们是用私有字段实现的,并自动生成具有相关作用域的访问器方法。当您使用该字段时,Kotlin会自动调用相关的访问器
如果您正在编写纯Kotlin,那么所有这些都是隐藏的,您不必担心它。但这个问题说明了当您混合使用Java和Kotlin时,它如何会引起惊喜
幸运的是,解决方法通常足够简单。在这种情况下,Parent
定义属性protected var count:Int=0
。生成的字节码将有一个名为count
的私有字段,并受保护getCount()
和setCount()
方法。因此,您可以通过调用这些方法来获得所需的效果。(当然,这是您在Java中通常要做的。)
有一些情况并不那么简单(例如,如果您正在扩展一个已经定义了与访问器冲突的方法的类),但这些情况非常罕见。那么kotlin
protected
中“protected”修饰符的重要性是什么?这意味着它可以在类和任何子类中访问。看见