一、主构造器
- 在Kt中允许定义一个主构造器(primary constructor )和若干个第二构造器(secondary constructor)
- 主构造器是类头的一部分,紧跟在类名后面,构造器参数是可选的
class Person constructor (firstName : String)
{
}
- 如果主构造器没有任何注释(annotation)或修饰器(modifier)constructor可以直接省略
class Person (firstName : String)
{
}
主构造器的初始化
class Person constructor (firstName : String){
//实现主构造器 进行初始化
var name = firstName //主构造器的参数还可以用于对类属性的初始化
init {
println(firstName)
}
}
Attention:
-》var val关键字也可以用于主构造器的参数,如果使用var,参数对于构造器来说是变量,
可以在构造器内部修改变量的值。
-》如果使用val声明,参数就变成了常量,在构造器内部不能修改该参数的值
-》即使使用var声明变量,在构造器内部修改参数变量值后,并不会把修改的值传到对象外部
二、第二构造器
Kt类除了可以声明一个主构造器外,还可以声明若干个第二构造器,第二构造器在类中声明,前面必须加constructor关键字
class Animation {
//第二构造器需要在类中声明,前面必须加constructor关键字
constructor(color: String) {
priintln(color)
}
}
- 如果类中声明了主构造器,那么所有第二构造器都需要在声明后面调用主构造器
- 或通过另外一个第二构造器间接调用主构造器
class QACommunity (var url:String){
// 主构造器实现部分
init {
println(url)
}
//第二构造器(通过this直接调用主构造器)
constructor(value : Int) : this("geekori.com"){
println(value)
}
//第二构造器(通过this直接调用主构造器)
constructor(description : String,url:String):this("["+ url+"]"){
println(description + ":"+ url)
}
//第二构造器(通过this调用第二构造器,并间接调用主构造器)
constructor():this(20){
println("https://geekori.com")
}
}
三、单例
无论是自动参数的构造器还是自己定义的构造器, 外部都是可以访问的,是public类型的, 如果要满足特殊需求,如实现单例模式(Singleton),可以使用private声明主构造器和第二构造器。
class Singleton private constructor()
{
public var value : Singleton ? = null
private object mHolder {val INSTANCE = Singleton()}
companion object Factory{
fun getInstance() : Singleton
{
return mHolder.INSTANCE
}
}
}
这里可以对比一下JAVA的单例模式
public class SingleInstance {
public static SingleInstance mInstance = null;
private SingleInstance()
{
}
public static SingleInstance getInstance(){
return mInstance = new SingleInstance();
}
}
打印出为同一个对象
四、默认参数
class Customer (val customerName : String = "Bill",var age : Int = 14 )
{
}