伴生对象:companion

Quibbler 2020-11-11 642

伴生对象:companion


        Kotlin语言中类不能有静态成员,像Java那样在类中用static关键字修饰的变量。


1、伴生对象

        但是Kotlin提供了伴生对象,这个概念提供类似Java中通过类访问其中静态成员的语法。


1.1、定义

        用companion关键字修饰在类中定义的对象。

class Master {
    //Master类的伴生对象
    companion object {
        fun server() {}
    }
    
}

        注意:每个类最多只能定义一个伴生对象


1.2、名称

        可以给伴生对象指定一个名称

class Master {
    companion object servent {
        fun server() {}
    }
}

        或者使用伴生对象的默认名称Companion



2、使用伴生对象

        通过外部的类名可以直接访问伴生对象中的方法和属性,不需要显示的指明伴生对象的名称(因为每个类最多只有一个伴生对象,显然范围哪个伴生对象是确定的)。


2.1、访问伴生对象

        在类的外部可以直接通过类名访问内部定义的伴生对象。

    //通过类名直接访问伴生对象的属性,只能再Koltin代码之间
    Master.server()
    
    //或者通过伴生对象的名称间接访问。java代码访问kotlin必须要用Companion或指定的名称
    Master.Companion.server()
    
    //下面两句等效,持有内部伴生对象实例。
    val tmp = Master.Companion
    val tmp = Master


2.2、伴生对象访问外部

        Java中的static方法无法调用所在类的方法,同样Kotlin中类的伴生对象,也不可以访问类中的方法。但是访问private构造方法,所以伴生对象却可以调用,用来创建工厂模式的不二之选。

class Master private constructor() {

    companion object {
        fun server() {
            val m = Master()
        }
    }
    
}


2.3、伴生对象扩展

        之前了解过Kotlin的扩展函数,可以定义类实例扩展的方法。伴生对象也是一个类的实例,能不能对其进行扩展呢?可以的,

class Master {
    companion object
}

        在类外部定义类伴生对象的扩展函数

fun Master.Companion.server() {
    println("server")
}

        其它地方可以调用伴生对象的扩展函数

    Master.server()
    Master.Companion.server()



不忘初心的阿甘
最新回复 (0)
    • 安卓笔记本
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com