【2025最新版Kotlin教程】Kotlin第一行代码系列第七课-Object单例,伴生对象

86 阅读2分钟
【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")
}
整个kotlin教程源码项目结构图:

在这里插入图片描述