Java与Kotlin中的类声明

时间:2018-10-31 07:47:55

标签: java kotlin

我是科特林的新手,并且我有以下疑问-

使用 Java到Kotlin转换器this Link),我将以下 Java代码转换为 Kotlin

Java类:

  public class Person { 
    private String name; 
    private int age; 

    public Person(String name, int age) { 
        this.name = name; 
        this.age = age; 
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
  }

科特林产生的阶级:

class Person(name:String, age:Int) {
  var name:String
  var age:Int = 0
  init{
    this.name = name
    this.age = age
  }
}

但是我不明白 Java代码和生成的 Kotlin代码是如何等效的,因为类数据成员的可见性修饰符从 private < / strong>(在Java中)为公开(在Kotlin中)。

我相信,如果保留可见性修饰符(在Kotlin中将数据成员声明为私有),则也必须在Kotlin中创建getter和setter,只有这样它们才是等效的。

3 个答案:

答案 0 :(得分:1)

在Kotlin中,它隐式地为字段创建getter和setter(在Java中也是如此)。由于这些字段是公共的,因此这些字段本身也将有效地变为公共字段。

实际上,由于getter和setter的性质(没有验证等),具有简化的getter和setter的Java代码相当于具有公共字段。

如果您的设置员完成了例如空检查和引发的IllegalArgumentExceptions,则代码将有所不同。

答案 1 :(得分:0)

Kotlin中的

public成员不等同于Java中的public成员。当被其他Java类访问时,它仍然对公众不可见。您需要在@JvmField前面添加var,以使其等效于Java中的public成员。

对于Kotlin class Foo { var bar = 1 }。要通过Java访问它,new Foo().bar不会编译。您必须使用new Foo().getBar()。从Java的角度来看,bar仍然是具有getter和setter的私有成员。

将Kotlin代码更改为class Foo { @JvmField var bar = 1 },它真正成为Java的公共成员。然后,您可以使用new Foo().bar

通过Java访问它

答案 2 :(得分:0)

val的情况下有吸气剂,在var的情况下有吸气剂。始终通过它们访问字段以进行读取或更改。 使用java类中的Kotlin类时,您会注意到它们。

如果getter或setter描述了默认行为,则将它们指向代码是没有道理的。

PS:如果您将Java类转换为Kotlin类,将会

class Person(var name: String?, var age: Int)