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,我是Kotlin的新手,我有以下疑问- 使用Java-to-Kotlin转换器(),我将以下Java代码转换为Kotlin Java类: public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } p

我是Kotlin的新手,我有以下疑问-

使用Java-to-Kotlin转换器(),我将以下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;
    }
  }
生成的Kotlin类:

class Person(name:String, age:Int) {
  var name:String
  var age:Int = 0
  init{
    this.name = name
    this.age = age
  }
}
但是我不明白Java代码和生成的Kotlin代码是如何等价的,因为类数据成员的可见性修饰符从私有(在Java中)更改为公共(在Kotlin中)


我认为,如果可见性修饰符被保留(数据成员在Kotlin中声明为私有),那么getter和setter也必须在Kotlin中创建,并且只有这样它们才应该是等效的。

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

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


将Kotlin代码更改为
类Foo{@JvmField var bar=1}
,它真正成为Java中的公共成员。然后,您可以通过Java使用
new Foo()访问它。在Kotlin中,它隐式地为字段创建getter和setter(Java中也有)。由于这些字段是公共的,因此字段本身实际上是公共的

由于getter和setter的性质(无验证等),使用简单的getter和setter的Java代码实际上相当于使用公共字段


如果您的设置程序执行了空检查和抛出IllegalArgumentException,代码就会不同。

对于
val
,有getter;对于
var
,有setter。读取或更改字段的访问始终通过它们。 在使用java类中的Kotlin类时,可以注意到它们

如果getter或setter描述了默认行为,那么在代码中指出它们是没有意义的

PS:如果您将java类转换为Kotlin类,您会喜欢

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

尽量避免使用链接作为参考,因为它们往往在一段时间后就过时了。实际上,它应该是
类人物(var name:String,var age:Int)
。你的Kotlin代码有更多的样板文件。顺便说一句,转换器不是完美的(目前),所以最好是手动,如果你可以。好的。注意到了,哦,是的。它们实际上是公开的。我不是那样想的。非常感谢。