Kotlin构造函数

Kotlin中的构造函数分为主构造函数和次构造函数:

注意:主构造函数有且只能有一个,次构造函数0~多个

1.1 主构造函数声明方式:类名 constructor(参数1,参数2。。。)

1.无参数
class Dog constructor(){}

2.有参数
class Dog constructor(name:String){}

3.如果主构造函数无修饰符如private,可省略关键字
class Dog{}
class Dog(name:String){}

4.如果主构造函数有修饰,不能省略关键字
class Dog private constructor(){}

1.2 主构造函数实现----init方法

class Dog(name:String){
  init{
        //主构造函数在init里面做事情
  }
}

1.3 主构造函数使用

场景:给Dog加一个属性name,并且在构造函数里赋值

普通写法:
class Dog(name:String){
  var name:String
  init{
      this.name = name  
  }
}
熟练写法:直接在主构造函数里name前加var val,即可使name变成Dog的属性,这样就会自动在init方法里赋值
class Dog(var name:String){}

2.1次构造函数的声明

1.一个无参的次构造函数
class Dog{
  constructor(){
  }
}
注意:这样写很多人会误以为constructor(){}  是主构造函数的实现,换一种写法就清晰了
class Dog constructor(){
  init{
      println("主构造函数")
  }
  constructor(){
      println("无次参构造函数")
  }
} 
结果打印:
主构造函数
无次参构造函数
所以请记住,init才是主构造函数的实现!

2.无参的次构造函数,有参的主构造函数
class Dog(var name:String) {
    init {
        println("主构造函数${this.name}")
    }
    constructor():this("Android"){
        println("无次参构造函数")
    }
}
var dog = Dog()
结果打印:
主构造函数Android
无次参构造函数
3.多个次构造函数
class Dog(var name:String) {
    init {
        println("主构造函数${this.name}")
    }
    constructor():this("Android"){
        println("无参构造函数")
    }
    constructor(age:Int):this(){
        println("有参构造函数")
    }
}

var dog = Dog(age:1)

打印结果:
主构造函数Android
无参构造函数
有参构造函数

1.次构造函数创建对象,会先执行主构造函数
2.如果主构造函数无参,那么次构造函数不用写:this(),否则,必须写this(参数)去调用主构造函数

场景:使用继承控件的方式自定义View

class MyTextView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : TextView(context, attrs, defStyleAttr){
  init{}
}
相当于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(){
  }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。