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

Kotlin数据类可以有多个构造函数吗?

呼延宪
2023-03-14

我知道数据类就像kotlin中的简单模型一样,默认情况下带有getter和setter,并且非常简单:

data class User(val name: String, val age: Int)

是否可以为该数据类声明第二个构造函数?

共有3个答案

冯泓
2023-03-14

是的,但是每个变量都应该初始化,所以您可以在数据类构造函数中设置默认参数,如下所示:

data class Person(val age: Int, val name: String = "Person without name")

现在,您可以通过两种方式创建这个数据类的实例

  • 人(30)
  • Person(20,“Bob”)
穆建元
2023-03-14

数据类的更新答案:

是的,你可以,但是你需要将一切委托给主构造函数

data class User(val name: String, val age: Int)
{
    constructor(name: String): this(name, -1) {
    }

    constructor(age: Int): this("Anon", age) {
    }
}

// Anon name: Anon
println("Anon name: " + User(30).name)

// No age: -1
println("No age: " + User("Name").age)

// Name: Name age: 20
val u = User("Name", 20)
println("Name: " + u.name + " age: " + u.age)

也可以像Alexey那样在主构造函数中设置默认值。

梁明辉
2023-03-14

Kotlin数据类必须具有定义至少一个成员的主构造函数。除此之外,还可以添加辅助构造函数,如类和继承-辅助构造函数中所述。

对于您的类,以及示例辅助构造函数:

data class User(val name: String, val age: Int) {
    constructor(name: String): this(name, -1) { ... }
}

请注意,二级构造函数必须在其定义中委托给主构造函数。

虽然二级构造函数的许多常见问题都可以通过为参数设置默认值来解决。在上述情况下,您可以简化为:

data class User(val name: String, val age: Int = -1) 

如果从Java调用这些,您应该阅读Javainterop-Java调用静态编程语言留档如何生成重载,有时可能是NoArg编译器插件为其他特殊情况。

 类似资料:
  • 问题内容: 这是一段代码,作为示例,其余的只是方法(迷宫类的底部)。所以当实例化时,使用 和 这将打印出网格阵列。这是合法的吗?我认为所有类都需要构造函数,它如何打印出二维网格数组? 迷宫课: 问题答案: 不需要 显式 定义构造函数;但是,所有类都必须具有构造函数,如果不提供任何默认构造函数,则将生成默认的空构造函数: 请参见默认构造函数。

  • 无论我用什么方法尝试,无论是主构造函数还是次构造函数,我都不知道如何在kotlin中声明一个带有超类和构造函数的新类。 这是我最想做的,但它给出了一个错误,期望成员声明。 这是我认为主要构造函数的外观,但它给出了相同的错误。在Internet上搜索没有帮助,我只能找到第二个示例。 那么,用一个超类和它的一个构造函数创建一个类的所有有效方法是什么呢?

  • 问题内容: 抽象类可以有构造函数吗? 如果是这样,它将如何使用以及用于什么目的? 问题答案: 是的,抽象类可以具有构造函数。考虑一下: 超类是抽象的,并且具有构造函数。具体的类具有仅对值2进行硬编码的构造函数。具体的类具有允许调用者指定值的构造函数。 抽象构造函数将经常用于强制类约束或不变量,例如设置类所需的最小字段。

  • 我是新手。我想在Person类驱动的Employee类中添加age参数。我怎么能在科特林做到?! 我的错误是这样的: 为什么不能在员工构造函数中使用var或val?!我犯了什么错误?

  • 我有一个(相当复杂的)数据类型: 现在我发现自己需要另一个数据类型…有两个构造函数。一个与的相同;另一个只存储一个。我有什么选择? 虽然这会起作用,但它也允许类似这样的东西,这是没有意义的。

  • 我正在尝试修改类Circle以包含第三个构造函数,用于构造具有两个参数的Circle实例——半径的双精度和颜色的字符串。还修改主类以使用此构造函数构造Circle的实例。我对此有困难,我一直收到从未使用构造函数Circle的消息。请查看代码。