Kotlin中的構(gòu)造函數(shù)分為主構(gòu)造函數(shù)和次構(gòu)造函數(shù):
注意:主構(gòu)造函數(shù)有且只能有一個,次構(gòu)造函數(shù)0~多個
1.1 主構(gòu)造函數(shù)聲明方式:類名 constructor(參數(shù)1,參數(shù)2相速。。叔扼。)
1.無參數(shù)
class Dog constructor(){}
2.有參數(shù)
class Dog constructor(name:String){}
3.如果主構(gòu)造函數(shù)無修飾符如private,可省略關(guān)鍵字
class Dog{}
class Dog(name:String){}
4.如果主構(gòu)造函數(shù)有修飾漫雷,不能省略關(guān)鍵字
class Dog private constructor(){}
1.2 主構(gòu)造函數(shù)實現(xiàn)----init方法
class Dog(name:String){
init{
//主構(gòu)造函數(shù)在init里面做事情
}
}
1.3 主構(gòu)造函數(shù)使用
場景:給Dog加一個屬性name,并且在構(gòu)造函數(shù)里賦值
普通寫法:
class Dog(name:String){
var name:String
init{
this.name = name
}
}
熟練寫法:直接在主構(gòu)造函數(shù)里name前加var val,即可使name變成Dog的屬性瓜富,這樣就會自動在init方法里賦值
class Dog(var name:String){}
2.1次構(gòu)造函數(shù)的聲明
1.一個無參的次構(gòu)造函數(shù)
class Dog{
constructor(){
}
}
注意:這樣寫很多人會誤以為constructor(){} 是主構(gòu)造函數(shù)的實現(xiàn),換一種寫法就清晰了
class Dog constructor(){
init{
println("主構(gòu)造函數(shù)")
}
constructor(){
println("無次參構(gòu)造函數(shù)")
}
}
結(jié)果打咏淀铩:
主構(gòu)造函數(shù)
無次參構(gòu)造函數(shù)
所以請記住与柑,init才是主構(gòu)造函數(shù)的實現(xiàn)!
2.無參的次構(gòu)造函數(shù)蓄坏,有參的主構(gòu)造函數(shù)
class Dog(var name:String) {
init {
println("主構(gòu)造函數(shù)${this.name}")
}
constructor():this("Android"){
println("無次參構(gòu)造函數(shù)")
}
}
var dog = Dog()
結(jié)果打蛹叟酢:
主構(gòu)造函數(shù)Android
無次參構(gòu)造函數(shù)
3.多個次構(gòu)造函數(shù)
class Dog(var name:String) {
init {
println("主構(gòu)造函數(shù)${this.name}")
}
constructor():this("Android"){
println("無參構(gòu)造函數(shù)")
}
constructor(age:Int):this(){
println("有參構(gòu)造函數(shù)")
}
}
var dog = Dog(age:1)
打印結(jié)果:
主構(gòu)造函數(shù)Android
無參構(gòu)造函數(shù)
有參構(gòu)造函數(shù)
1.次構(gòu)造函數(shù)創(chuàng)建對象,會先執(zhí)行主構(gòu)造函數(shù)
2.如果主構(gòu)造函數(shù)無參涡戳,那么次構(gòu)造函數(shù)不用寫:this(),否則结蟋,必須寫this(參數(shù))去調(diào)用主構(gòu)造函數(shù)
場景:使用繼承控件的方式自定義View
class MyTextView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : TextView(context, attrs, defStyleAttr){
init{}
}
相當(dāng)于Java
public class MyTextView extends TextView {
public MyTextView(Context context) {
this(context,null,0);
}
public MyTextView(Context context, AttributeSet attrs) {
this(context,attrs,0);
}
public MyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void init(){
}
}