Kotlin构造函数与单例
前言
- 类是同一类事物的高度抽象的,不实际存在的(不会占内存)的概念
- 对象是类的实例化,现实化(具体存在,完成具体任务<存值,执行>)
- 存值:成员变量,属性变量
- 执行:行为,方法
为什么要有构造函数?
-
默认的无参构造函数
类本身不知道如何创建⾃⼰的对象,对象本身是由顶层类来构建,再由当前这个类来初始化那个对象
-
重载的有参构造⽅法
- 为了⽅便给初始化值
- 在创建对象的同时给予某些需要的数据(时机)
单例对象
单例对象概念
当我们巧妙使⽤private来私有化构造⽅法,给外部提供⼀个单例对象(整个程序运⾏中这个类只有⼀个对象)
如何得到单例对象
Java
-
私有化构造⽅法 -> 使外部⽆法创建这个类的对象
private Animal(){}
-
在类内部提供⼀个静态的成员属性 -> 静态变量只会初始化⼀次
public static Animal instance = new Animal();
-
给外部提供⼀个静态⽅法 -> 获取这个对象
注意: 此处未考虑内存消耗和线程安全
public static Animal getInstance(){ return instance; }
-
外部获取这个对象
Animal.getInstance();
注意:系统类库中以下开头的⽅法通常都是提供单例
- instance
- shared
- default
Kotlin
class Animal private constructor(){ // kotlin单例不完善版本
companion object{
private val defaultInstance = Animal()
fun getInstance(): Animal {
return defaultInstance
}
}
}
class Animal private constructor() { // kotlin单例一般写法
companion object {
val sharedAnimal: Animal by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
Animal()
}
}
}
Kotlin构造函数
-
主构造函数
-
创建⼀个没有主体的类
class Person
-
-
显示指定构造⽅法
class Person2 constructor()
-
主构造函数需要传递⼀个字符串对象 constructor不能省略
class Person3 constructor(var name:String)
-
有修饰符限定构造函数权限时 constructor不能省略
class Person4 private constructor()
-
如果有⽗类,必须直接调⽤⽗类的构造函数
open class Father class Person5 : Father()
-
如果⽗类有参数 ⼦类必须提供相应有参的构造函数
open class Father2 constructor(name: String) class Person6 constructor(name: String) : Father2(name)
-
次构造函数
constructor(name:String) : this(){} // 注意:a.次构造函数必须直接调⽤主构造函数 // b.如果有⽗类,必须调⽤⽗类的构造函数
- 次构造函数必须继承主构造函数
```kotlin
class Person7(name: String) {
constructor(name: String, age: Int): this(name)
}
```
-
次构造函数只需要考虑和主构函数的关系
open class Father3 constructor(name: String) class Person8 constructor(name: String) : Father3(name){ constructor(name: String, age: Int):this(name) }