Kotlin的建筑师
我正在从官方文档学习Kotlin
,我创建了一个class
,如下创建一个具有两个parameters
constructor
parameters
。 constructor
主体在init
块中。
class Person(name: String, surname: String) { init { Log.d("App", "Hello"); } }
那么,我想创建一个更多的constructor
,将采取一个constructor
中的一个parameter
。 Kotlin
什么办法呢?
那么init
不是构造函数的主体。 它在主构造函数与主构造函数的上下文之后被调用。
正式文件中给出:
主构造函数不能包含任何代码。 初始化代码可以放在以init关键字为前缀的初始化块中:
class Customer(name: String) { init { logger.info("Customer initialized with value ${name}") } }
请注意,主构造函数的参数可以在初始化块中使用。 它们也可以用在类体中声明的属性初始值设定项中:
class Customer(name: String) { val customerKey = name.toUpperCase() }
实际上,为了从主构造函数声明属性并初始化它们,Kotlin有一个简洁的语法:
class Person(val firstName: String, val lastName: String, var age: Int) { // ... }
根据你的问题,你可以添加一个构造函数来接受一个参数,如下所示:
class Person(name: String, surname: String) { constructor(name: String) : this(name, "") { // constructor body } init { Log.d("App", "Hello"); } }
但它看起来不正确,因为我们没有必要传递第二个参数空字符串。 所以我们可以像下面这样命令构造函数:
class Person(name: String) { constructor(name: String, surname: String) : this(name) { // constructor body } init { Log.d("App", "Hello"); } }
希望它有帮助。
在类里面使用constructor
关键字来创建二级构造函数。 喜欢 :
class Person(name: String, surname: String) { init { Log.d("App", "Hello"); } constructor(id: Int) { } }
有关更多信息,请查看辅助构造器
编辑:
规则:如果类具有主构造函数,则每个次构造函数都需要通过另一个辅助构造函数直接或间接地委托给主构造函数。 向同一类的另一个构造函数的委托使用this关键字完成。
class Person(val name: String) { constructor(name: String, parent: Person) : this(name) { parent.children.add(this) } }
所以当你调用二级构造函数时,它会调用主构造函数来初始化名称,然后在二级构造函数中做你的东西。 在上面的例子中,通过调用主构造函数初始化该名称。
第一种方法是用空值
// (name: String, surname: String) default constructor signature class Person(name: String, surname: String) { // init block , represents the body of default constructor init { Log.d("primary", "Hello"); } // secondary constructor // this(name,"") call to default constructor constructor(name : String):this(name,""){ Log.d("secondary", "Hello"); } }
为什么this(name,"")
如果类具有主构造函数,则每个次构造函数都需要通过另一个次构造函数直接或间接地委托给主构造函数。 使用this关键字来完成对同一类的另一个构造函数的委托:
要么
kotlin不会允许像this(name,null)
使用null
this(name,null)
所以使用?
用类型来表示null
值surname: String?
class Person(name: String, surname: String?) { init { Log.d("primary", "Hello"); } constructor(name : String):this(name,null){ Log.d("secondary", "Hello"); } }
次要构造函数
该类也可以声明次构造函数,它们的前缀是构造函数:
class Person { constructor(parent: Person) { parent.children.add(this) } }
如果类具有主构造函数,则每个次构造函数都需要通过另一个次构造函数直接或间接地委托给主构造函数。 使用this关键字来完成对同一类的另一个构造函数的委托:
class Person(val name: String) { constructor(name: String, parent: Person) : this(name) { parent.children.add(this) } }
请参阅https://kotlinlang.org/docs/reference/classes.html辅助构造函数部分
这是你如何创建另一个构造函数。
class Person(name: String, surname: String) { init { Log.d("App", "Hello"); } constructor(id: Int) : this("example name", "example surname") { } }
一定要记住,二级构造函数将不得不使用this关键字引用主构造函数和它的参数。