一、初始化类:主构造方法和初始化语句块
通常来讲,类的所有声明应该在花括号里面。这里面被括号括起来的叫主构造方法
主构造方法主要目的:
- 1.表明构造函数参数;
- 2.定义使用这些参数初始化属性
让我们来揭示他的工作原理:
class Animal constructor(_name: String) {//带一个参数的主构造函数
val name: String
init {//初始化函数
name = _name
}
}
在上面的代码中,可以看到两个新的kotlin关键字:constructor&init。
constructor关键字用开始一个构造方法的声明。
init关键字用来引入一个初始化语句块,并会与主构造方法一起使用。因为主构造语句有语法限制,不能包含初始化代码,这就是为什么使用初始化语句块的原因。
在这个例子中,不需要把初始化代码放在初始化语句块中,因为他可以和name属性结合。如果主构造没有注解或可见性修饰符,同样可以将constructor关键字省略。
所以简化后的代码如下
class Animal(_name: String) {//带一个参数的主构造
val name = _name//用参数来初始化属性
}
这就是声明同样的类的另一种方法。如果属性可以通过构造方法初始化,代码可以通过吧val关键字加到构造方法参数之前的方式来简化。
这样就可以简化成如下代码:
构造参数也可以想函数一样生命一个默认值:
class Animal(var _name: String, var age : Int = 3)
fun main() {
Animal("lynnlee", 2)
Animal(name = "lynnlee", age = 2)//命名参数
Animal("lynnlee")//第二个参数使用默认值3
}
如果你的类具有一个父类,主构造方法同样需要初始化父类。
open class Animal(var name: String, var age: Int = 3)
class Cat(name: String) : Animal(name)//Cat声明主构造参数不要var/val,因为是父类的属性,不需要setter&getter
fun main() {
Cat("temo")
}
如果继承了Animal类,必须显示地调用父类的构造方法,即使他没有任何参数,这就是为什么在父类后买你还带一个括号的原因。注意和接口的区别,接口没有构造,所以不需要跟括号。
open class Animal
class Cat : Animal()//必须带口号
如果你要确保你的类不会被别人实例化,必须把构造方法标记为private。
class Animal private constructor()
fun main() {
Animal()//报错,无法实例化
}