kotlin的构造函数
只要是面向对象的语言,就会有构造函数的概念,那啥是构造函数,其实就是你初始化类时调用的函数,在kotlin中构造函数分为主构造函数和次构造函数。
主构造函数
kotlin中主构造函数是在类名后面括号表示的,注意这里和java不一样,java中和类名相同的函数就是构造函数,且不分主构造函数和次构造函数。
class Person(name : String, sex : Int) {
}
没有参数的主构造函数
class Person() {
}
当没有参数时,也可以去掉括号,这样默认主构造函数为无参构造,但是注意如果此时定义一个下文中说的次构造函数,那么此类就没有主构造函数了,学过java的就很好理解,java中仅定义个有参构造方法,那么默认就没有了无参构造,初始化只能调用这个有参构造方法
class Person {
}
次构造函数
再来说一下kotlin中的次构造函数,次构造函数是有函数体的,次构造函数用constructor
关键字表示,而且kotlin规定:所有的次构造函数必须调用主构造函数
//无参的主构造函数,这里调用主构造函数采用this关键字
class Person() {
constructor(name : String, sex : Int) : this()
}
//有参的主构造函数,这里调用主构造函数采用this关键字
class Person(name : String, sex : Int) {
constructor() : this("zhangsan",1)
}
//仅有次构造函数,没有主构造函数,所以不需要调用主构造函数
class Person {
constructor(name : String, sex : Int)
}
@JvmOverloads注解的作用
看看主构造函数和次构造函数在实际当中的应用,这里以自定义View举例
//ConstraintLayout应该是没有主构造函数,所以这里调用三个构造函数中的一个
class MyCView(context: Context) : ConstraintLayout(context) {
}
上述代码只能在代码中调用,而不能在xml中调用,这里我们直接用三个参数的方法
//调用View三个参数的构造函数
class MyCView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
ConstraintLayout(context, attrs, defStyleAttr) {
}
//带有默认值的构造函数
class MyCView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
ConstraintLayout(context, attrs, defStyleAttr) {
}
注意这里的@JvmOverloads
注解,是因为.java文件无法调用到有默认参数值的方法,这个时候就可以用@JvmOverloads
修饰之后就可以调用了
//次构造方法
class MyCView : ConstraintLayout {
constructor(context : Context) : super(context)
constructor(context: Context, attrs : AttributeSet?) : super(context,attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr : Int) : super(context,attrs,defStyleAttr)
}
其他kotlin关键字
data
:数据类,可以自动生成get/set方法
object
: 单例类、引出抽象类/接口的关键字
open
:修饰类,代表此类可被继承