当我使用数据类或常规类并将参数设置为其构造函数时,它会在Java代码中生成getter / setter,但在Kotlin中,我们可以通过变量名来实现。它是仅在Java中私有的,还是Kotlin用变量名替换其getter / setter?
班级
class Person(var name: String)
从kotlin代码调用它时,您可以看到我叫名称变量
fun main() {
print(Person("Mohammed").name)
}
从Java调用它时,可以看到我调用了方法,而不是变量
public static void main(String[] args) {
System.out.println(new Person("Mohammed").getName());
}
但我不能使用
public static void main(String[] args) {
System.out.println(new Person("Mohammed").name);
}
IntelliJ显示name
是私有的。
因此,问题是-参数是私有的,还是仅对Java代码私有的? Kotlin是否用变量名替换其getter / setter,然后在运行时将其反转?
答案 0 :(得分:3)
让我们从这个问题的误解开始:
问题是参数是私有参数,还是仅对Java代码而言?
没有诸如“仅用于Java的私有”之类的东西。
提醒:无论您是写Kotlin并使用kotlinc还是Java与javac一起使用,最终,源代码都将编译为JVM class 文件。该文件中的内容和信息决定了“用户”可以对您的班级做什么。
当我编译您的Person.kt类并运行javap时,将显示以下内容:
> javap Person.class
Compiled from "Person.kt"
public final class Person {
public final java.lang.String getName();
public final void setName(java.lang.String);
public Person(java.lang.String);
}
重点是:如您所见,该字段有一个 getter 。
除此之外,类文件中还包含元信息,该信息告诉 Kotlin 编译器该类“是” Kotlin类。
因此Kotlin编译器允许您直接使用somePerson.name
。