在Kotlin中,构造函数是一个类似于方法的代码块。 声明构造函数的名称与类的名称相同,后跟括号()
。 构造函数用于在创建对象时初始化变量。
Kotlin中有两种类型的构造函数:
Kotlin类中只有一个主要构造函数,而辅助构造函数可以是一个或多个。
主构造函数用于初始化类,它在类标题中声明。 主构造函数代码由带有可选参数的括号括起。
下面来看看一个主构造函数声明的例子。 在下面的代码中,我们声明了一个带有两个参数:name
和id
的构造函数myClass
。 参数name
是只读属性,而id
是读取和写入属性。
class myClass(valname: String,varid: Int) { // class body }
当创建myClasss
的对象时,分别使用:Susen
和10010
这两个值来初始化name
和id
属性。
class myClass(val name: String, var id: Int) { } fun main(args: Array<String>){ val myclass = myClass ("Susen", 10010) println("Name = ${ myclass.name}") println("Id = ${ myclass.id}") }
执行上面示例代码,得到以下结果 -
Name = Susen Id = 10010
主构造函数不包含任何代码,初始化程序块用于初始化代码。 该块是以init
关键字为前缀。 在实例初始化期间,初始化块的执行顺序与它们在类体中出现的顺序相同。
下面使用初始化块重写上面的代码:
class myClass(name: String, id: Int) { val e_name: String var e_id: Int init{ e_name = name.capitalize() e_id = id println("Name = ${e_name}") println("Id = ${e_id}") } } fun main(args: Array<String>){ val myclass = myClass ("Maxsu", 10010) }
执行上面示例代码,得到以下结果 -
Name = Maxsu Id = 10010
在上面的代码中,参数name
和id
在创建myclass
对象时接受值分别是:Maxsu
和10010
。 声明name
和id
属性时没有val
或var
,因此它们不是myClass
类的属性。
当创建myClass
类的对象时,它将执行初始化块,初始化name
和e_id
。
Kotlin在类中创建一个或多个辅助构造函数。 使用constructor
关键字创建辅助构造函数。
下面来看一个辅助构造函数声明的示例。在下面的代码中,我们声明了myClass
的两个构造函数,它有两个参数:name
和id
。
class myClass{ constructor(id: Int){ //code } constructor(name: String, id: Int){ //code } }
让我们看一下辅助构造函数在创建类的对象时分配值的示例。
class myClass{ constructor(name: String, id: Int){ println("Name = ${name}") println("Id = ${id}") } } fun main(args: Array<String>){ val myclass = myClass ("Maxsu", 10010) }
执行上面示例代码,得到以下结果 -
Name = Maxsu Id = 10010
也可以在同一个类中使用主和辅助构造函数。 通过在同一个类中使用主和辅助构造函数,辅助构造函数需要授权给主构造函数。 使用this()
关键字对同一个类中的另一个构造函数进行授权。
例如:
class myClass(password: String){ constructor(name: String, id: Int, password: String): this(password){ println("Name = ${name}") println("Id = ${id}") println("Password = ${password}") } } fun main(args: Array<String>){ val myclass = myClass ("Maxsu", 101, "passwd123") }
执行上面示例代码,得到以下结果 -
Name = Maxsu Id = 101 Password = passwd123
从同一个类的一个辅助构造函数调用另一个辅助构造函数
在Kotlin中,一个辅助构造函数可以调用同一个类的另一个辅助构造函数。 可通过使用this()
关键字完成的。
例如:
class myClass{ constructor(name: String, id: Int): this(name,id, "mypassword"){ println("第二个执行") println("Name = ${name}") println("Id = ${id}") } constructor(name: String, id: Int,pass: String){ println("第一个执行") println("Name = ${name}") println("Id = ${id}") println("Password = ${pass}") } } fun main(args: Array<String>){ val myclass = myClass ("Maxsu", 10010) }
执行上面示例代码,得到以下结果 -
第一个执行 Name = Maxsu Id = 10010 Password = mypassword 第二个执行 Name = Maxsu Id = 10010
从派生类辅助构造函数调用超类辅助构造函数
在Kotlin中,一个派生类的辅助构造函数可以调用基类的辅助构造函数。可使用super
关键字完成的,它是继承的概念。
open class Parent{ constructor(name: String, id: Int){ println("第一个执行") println("Name = ${name}") println("Id = ${id}") } constructor(name: String, id: Int,pass: String){ println("第三个执行") println("Name = ${name}") println("Id = ${id}") println("Password = ${pass}") } } class Child: Parent{ constructor(name: String, id: Int): super(name,id){ println("第二个执行") println("Name = ${name}") println("Id = ${id}") } constructor(name: String, id: Int,pass: String):super(name,id,"password"){ println("第四个执行") println("Name = ${name}") println("Id = ${id}") println("Password = ${pass}") } } fun main(args: Array<String>){ val obj1 = Child("Susen", 10010) val obj2 = Child("Susen", 10010,"mypassword") }
执行上面示例代码,得到以下结果 -
第一个执行 Name = Susen Id = 10010 第二个执行 Name = Susen Id = 10010 第三个执行 Name = Susen Id = 10010 Password = password 第四个执行 Name = Susen Id = 10010 Password = mypassword