Kotlin的主要构造函数的参数是全部私有还是仅对Java代码私有?

时间:2019-09-03 11:29:31

标签: java kotlin

当我使用数据类或常规类并将参数设置为其构造函数时,它会在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,然后在运行时将其反转?

1 个答案:

答案 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