1.主构造函数
package Kotlin.Stage4
//主构造函数,规范来说,都是增加_xxx的形式,临时的输入类型,不能直接用。需要接收下来,成为变量才能用。
class TestBase(_name:String,_sex:Char,_age:Int,_info:String){ //主构造函数
var name=_name
get() = field //get不允许私有化
private set(value) { //私有化的set在调用时 不能访问,无法set
field=value
}
val sex=_sex
get() = field
//set(value){} 由于是只读val的 因此无法使用set函数
var age=_age
get() = field +1
var info=_info
get() = "【$field】"
fun show(){
//println(_name) _name临时输入类型 不能直接用,需要接收才能用
println(name)
println(sex)
println(age)
println(info)
}
}
fun main() {
//创建对象
var p=TestBase(_name = "kotlin",_age = 20,_sex = '男',_info = "我是语言")
p.show()
}
执行结果
类似java中的this.nam=name
2.主构造函数里面定义属性
优化上述构造,一步到位
package Kotlin.Stage4
class TestBase1(var name:String,val sex:Char,var age:Int, var info:String){ //主构造函数
fun show(){
println(name)
println(sex)
println(age)
println(info)
}
}
fun main() {
//创建对象
var p=TestBase1(name = "kotlin",age = 20,sex = '男',info = "我是语言")
p.show()
}
执行结果
3.次构造函数
constructor()
package Kotlin.Stage4
class TestBase3(name:String){ //主构造
//次构造函数必须调用主构造,否在会报错。主构造统一管理,为了更好的初始化
//2个参数的次构造
constructor(name: String,sex:Char):this(name){
println("2个参数的次构造函数:name=$name,sex=$sex")
}
constructor(name: String,sex: Char,age:Int):this(name){
println("3个参数的次构造函数:name=$name,sex=$sex,age=$age")
}
constructor(name: String,sex: Char,age:Int,info:String):this(name){
println("3个参数的次构造函数:name=$name,sex=$sex,age=$age,info=$info")
}
}
fun main() {
//调用主构造
TestBase3("java")
//调用次构造
TestBase3("kotlin",'m')
TestBase3("kotlin",'m',25)
TestBase3("kotlin",'m',25,"我是语言")
}
执行结果
4.构造函数默认参数
如果用户不传入参数,可以直接使用默认值
package Kotlin.Stage4
class TestBase4(name:String="java"){ //主构造
//次构造函数必须调用主构造,否在会报错。主构造统一管理,为了更好的初始化
//2个参数的次构造
constructor(name: String="kotlin",sex:Char='w'):this(name){
println("2个参数的次构造函数:name=$name,sex=$sex")
}
constructor(name: String="c",sex: Char='m',age:Int=25):this(name){
println("3个参数的次构造函数:name=$name,sex=$sex,age=$age")
}
constructor(name: String="c++",sex: Char='m',age:Int=35,info:String="我是语言"):this(name){
println("3个参数的次构造函数:name=$name,sex=$sex,age=$age,info=$info")
}
fun show(){
println("主构造函数调用结果")
}
}
fun main() {
//调用主构造
TestBase4("java")
//调用次构造
TestBase4("kotlin",'m')
TestBase4("kotlin",'m',25)
TestBase4("kotlin",'m',25,"我是语言")
//上述传入参数会覆盖默认参数
TestBase4().show() //此种情况下会优先调用主构造
}
执行结果