1.示例1,创建一个类及并包含两个构造函数:
class Book constructor(name:String,price:Float){
private var name:String
private var price:Float
//初始化块
init {
this.name=name
this.price=price
println("初始化块1")
}
//主构造函数的参数可以给类内属性初始化使用
var bookInfo="Book name:"+name+" price:"+price.toString();
init {
println("初始化块2")
}
//次构造函数的调用需要委托给主构造函数
constructor(name:String,price:Float,message:String):this(name,price){
println("$message")
}
public fun printInfo(){
println(bookInfo)
}
}
(1)主构造函数在类的名称之后,是类头的一部分,如果主构造函数有注解或可见性修饰符,这个 constructor 关键字是必需的,并且这些修饰符在它前面,否则可以省略。
constructor(name:String,price:Float)
(2)类要初始化的内容放在初始化块中,它会伴随类的创建而执行,可以有多个初始化块,其执行顺序与声明顺序相同。
init {
this.name=name
this.price=price
println("初始化块1")
}
init {
println("初始化块2")
}
(3)次构造函数的调用需要委托给主构造函数。
constructor(name:String,price:Float,message:String):this(name,price){
println("$message")
}
(4)主构造函数的参数可以给类内属性初始化时使用。
var bookInfo="Book name:"+name+" price:"+price.toString();
(5)Kotlin没有new关键字。
var book=Book("小王子",30F,"Hello")
输出结果:
初始化块1
初始化块2
Hello
2.创建一个类,在类头未声明主构造函数参数:
class Student{
init {
println("这里是初始化块!")
}
constructor(name:String){
println("Hello,我是 $name")
}
constructor(name: String,age:Int){
println("Hello,我是 $name,我今年$age 岁了")
}
}
}
(1)在创建对象时会根据参数选择相应的次构造函数
var newStudent=Student("张三",12)
var newStudent2=Student("李四")
输出结果:
这里是初始化块!
Hello,我是 张三,我今年12 岁了
这里是初始化块!
Hello,我是 李四