在关键字一——var和val中最后提到了构造函数,这里就学习下构造函数相关的关键字: constructor和init。
主要构造(primary constructor)
kotlin和java一样,在定义类时就自动生成了无参构造
kotlin">// 会生成默认的无参构造函数
class Person{
}
与java不同的是,当kotlin的构造函数中必须带参数时,则需要在类名后面直接添加参数:
kotlin">class Person(var name:String, var age:Int){
}
这种在类名后面添加参数(包含无参)的构造方法就称为主要构造(primary constructor)
次要构造(secondary constructor)
当类包含多个构造函数时,需要通过次要构造实现, 次要构造需要用constructor关键字修饰:
kotlin">// primary constructor
class Person(var age: Int, var name: String) {
// secondary constructor
constructor(name: String) : this(18, name = name)
}
次要构造使用上需要注意:
- 次要构造需要直接或间接调用主要构造
kotlin">// primary constructor class Person(var age: Int, var name: String) { // 会提示: Primary constructor call expected constructor(name: String) }
- 次要构造中不能声明类的属性,即不能使用var或val
kotlin">class Person(var age: Int, var name: String) { constructor(name: String) : this(age = 18, name) // 提示'var' on secondary constructor parameter is not allowed constructor(var address:String, name: String):this(name) }
init_41">init
kotlin提供了一个方法init,当有多个构造方法,无论使用哪个构造方法都会调用到init方法:
kotlin">// 调用 Person("xiao ming")或者 Person(16, "小明")后 都会输出
// I am a person
class Person(var age: Int, var name: String) {
constructor(name: String) : this(age = 18, name)
init {
System.out.println("I am a person")
}
}
可以看下实现原理:
public final class Person {
public Person(int age, @NotNull String name) {
super();
this.age = age;
this.name = name;
// init方法
System.out.println("I am a person");
}
public Person(@NotNull String name) {
this(18, name);
}
}