Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 理解Kotlin访问修饰符_Java_Kotlin - Fatal编程技术网

Java 理解Kotlin访问修饰符

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

我在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 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”修饰符的重要性是什么?这意味着它可以在类和任何子类中访问。看见