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(){
}
}