【2025最新版Kotlin教程】Kotlin第一行代码系列第七课-Object单例,伴生对象
Object的各种用法 匿名,单例,伴生
一、匿名内部类
顾名思义,它是没有名字的内部类
interface A {
fun funA()
}
abstract class B {
abstract fun funB()
}
fun main() {
/**
* 假设我想用接口A和抽象类B,但我就用一次,不想见子类怎么办
* 这是匿名内部类就派上用场了
*/
val item = object :B(),A{
override fun funA() {
println("我是你们内部类啊A")
}
override fun funB() {
println("我是你们内部类啊B")
}
}
// 在Android开发中使用例子
// imageView.setOnClickListener(object: View.OnClickListener {
// override fun onClick(v: View?) {
// println("点击了图片")
// }
// })
}
二、单例
关键字object
/**
* 单例 关键字object
* 单例啥意思呢,首先它不用你手动对象,它本身就是个对象
* 使用场景:往往某一个类工具类可以定为单例,直接调用
*/
//通过使用object标识为单例
object Singleton{
fun log(str:String){
println(str)
}
}
fun main() {
//直接通过类名调用方法,类似Java中的静态方法
Singleton.log("我是单例中的log方法。")
}
三、伴生对象
嵌套在类中的单例 companion object
/**
* 伴生对象
* 嵌套在类中的单例 companion object
*/
//使用场景:Kotlin类中声明的方法都是非静态的
//但是有时候也会想把部分方法定义为静态,则可以使用companion object关键字进行标识
class CompanionObjectDemo {
companion object{
val TYPE = 100
fun log(string: String){
println("我来自伴生对象的方法---${string}")
}
}
fun other(str : String){
println(str)
}
}
fun main() {
//调用伴生对象的方法
CompanionObjectDemo.log("companion function")
//调用伴生对象的变量
println(CompanionObjectDemo.TYPE)
var demo = CompanionObjectDemo()
//调用对象中的方法
demo.other("other function")
}
四、伴生对象DoubleCheck
/**
* 额外知识:带参数的单例,且线程安全
*/
class UserDb private constructor(name: String) {
companion object {
// 要加@Volatile
@Volatile private var INSTANCE: UserDb? = null
fun getInstance(name: String): UserDb =
// 第一次判空
INSTANCE?: synchronized(this) {
// 第二次判空
INSTANCE?:UserDb(name).also { INSTANCE = it }
}
}
}
fun main() {
// 使用
UserDb.getInstance("sql db")
}