天天看点

十一、Kotlin学习之构造方法

一、初始化类:主构造方法和初始化语句块

通常来讲,类的所有声明应该在花括号里面。这里面被括号括起来的叫主构造方法

主构造方法主要目的:

  • 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()//报错,无法实例化
}