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() //此种情况下会优先调用主构造
}
 
执行结果
 














![BUUCTF:[MRCTF2020]套娃](https://img-blog.csdnimg.cn/0dcb3859402144b5bfdf28d5d8327299.png)




