当前位置: 首页 > 知识库问答 >
问题:

Java与Kotlin中的类声明

简学文
2023-03-14

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

使用Java到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代码和生成的静态编程语言代码是如何等价的,因为类数据成员的可见性修饰符从私有(Java)变为公共(静态编程语言)。

我相信,如果可见性修饰符被保留(数据成员在静态编程语言中被声明为私有),getter和setter也必须在静态编程语言中创建,只有这样它们才应该是等效的。

共有3个答案

谭凯
2023-03-14

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

如果getters或setters描述了默认行为,那么在代码中指向它们是没有意义的。

PS:如果你将你的java类转换为静态编程语言类,会喜欢

class Person(var name: String?, var age: Int)
支劲
2023-03-14

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

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

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

翟卓君
2023-03-14

在静态编程语言中,它隐式地为字段创建getter和setter(您在Java中也有)。由于这些是公共的,字段本身实际上是公共的。

实际上,由于getter和setter的特性(没有验证等),带有简单getter和setter的Java代码相当于拥有公共字段。).

如果您的setters执行了空检查和抛出IllegalArgumentExceptions,代码会有所不同。

 类似资料:
  • 问题内容: 在Kotlin中,模式匹配很好,并且在90%的用例中,它不执行下一个模式匹配也很不错。 在Android中,当数据库更新时,如果不让代码看起来像这样,我们将使用Java switch属性进行下一种情况: 因此,如果某人拥有一个数据库版本为1的应用程序,而错过了DB v2版本的应用程序,则他将获得所有所需的升级代码。 转换为Kotlin后,我们会像这样混乱: 这里只有3个版本,假设DB达

  • 在Java类中,我通常在单个常量文件中声明我的所有常量,并跨项目访问 如何在Kotlin中实现相同 Java代码:

  • fun setCollection(collection:(Mutable)Collection !):KotlinClass中定义的单元 无论我做什么,都没有办法只用Kotlin代码来编译它。 再现情况的代码: Java本身就不存在这个问题。所以我猜测这可能与平台类型有关(不是)。 有没有一个优雅的解决方案来解决这个问题,最好不需要编写Java代码?还是应该在Kotlin编译器中解决这个问题?

  • 为什么不是: 如有任何帮助,我们将不胜感激。

  • 问题内容: 在什么情况下可能会得出与之不同的结果? 我认为这可能与外部类的子类实例化一个未声明为静态的内部类有关,但我无法以这种方式获得区别: 输出: 问题答案: 在此处找到http://kickjava.com/1139.htm#ixzz1mv2nEWg7: “具有getDeclaringClass的替代项是,在Java语言规范中,匿名内部类不计为类的成员,而命名内部类为。因此,此方法为匿名类返

  • 我最近盯着Kotlin看,有Java的经验。在Java中,我们可以声明与在parent中同名的字段。当我在中这样做时,它给出错误的成员。我错过了什么?