Kotlin学习之伴生对象companion object

对象声明

我们都知道在在Java中 不可能单纯有一个对象存在的,对象一定是通过类来创建它的实例的,通过new这个关键字来创建一个类的对象,这样呢,这个对象才会在内存当中创建出来。

在Kotlin当中,有这么一个新的概念,可以直接声明个对象,我们定义一个类用class关键字,我们声明一个对象就用object关键字。它的语法呢和Kotlin类的语法是极为相似的。

object MyObject{
    
}

这就是对象声明,并且它总是在 object 关键字后跟⼀个名称。表示我声明了一个对象,对象的名字叫MyObject。对象是可以拥有属性也可以拥有方法的,跟类是一样的。

object MyObject {
    fun method() {

    }
}

定义好对象之后呢,就可以直接调用了

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
       
        MyObject.method()
    }

因为本身就是一个对象了,不需要像类一样要创建实例,可以直接调用方法。这就被称作对象声明。

使用场景

看了上面的小例子,感觉还是很简单的,那这种对象声明用在什么地方呢?学了这个知识点终归是要用的啊。

可以用于创建单例对象
作为23种设计模式之一的单例模式,相信很多学习Java的小伙伴都是知道的,在Kotlin中,直接利用对象声明这个高级特性将类的声明和实例的创建结合在一起,就完美达到了单例模式的要求,如下代码所示:

object Singleton{
    val info =  "string"
    fun out(suffix: String){
        println("$info---$suffix")
    }
}

fun main(args: Array<String>) {
    Singleton.out("xxx")
}

由于我们不能以其他方式创建Singleton的对象,所以它是满足单例模式的。 

伴生对象

在Kotlin中,与Java不同的是,类是没有static方法的。在大多数情况下,Kotlin推荐的做法是使用包级别的函数作为静态方法。

所以Kotlin会将包级别的函数当做静态方法来看待。

什么叫伴生对象,就是随着类的存在而存在。

class MyTest {
   companion object MyObject{

   }
}

我创建了一个MyObject的伴生对象,它随着外面的类MyClass的而存在。

class MyTest {
    companion object MyObject {
        var num: Int = 100

        fun method() {
            println("method invoked")
        }
    }
}

在里面定义了成员变量num和method方法。这里面的语法和普通的类是一样的,但是这个伴生对象到底会起一个什么样的作用呢?

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        MyTest.MyObject.method()
    }

使用里面的method()方法,还可以通过用类名直接调用方法和属性:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        MyTest.method()
        MyTest.num
    }

这类似于Java中的静态方法,这就是伴生对象所起到的重要作用。

还可以把伴生对象名字省略掉,也是可以的。因为我们直接用类名调用属性和方法,这个名字是无用的。

class MyTest {
    companion object {
        var num: Int = 100

        fun method() {
            println("method invoked")
        }
    }
}

请注意,即使伴⽣对象的成员看起来像其他语⾔的静态成员,在运⾏时他们仍然是真实对象的实例成 员,我们可以使⽤ @JvmStatic

注解,你可以将伴⽣对象的成员⽣成为真正的静态⽅法和 字段。

猜你喜欢

转载自blog.csdn.net/jingerlovexiaojie/article/details/106577365