kotlin精讲-第4章(5)kotlin Object关键字
创建单例
Java中的单例
什么是单例?单例是一种设计模式,用来保证某一个类只有一个实例。在Kotlin中,Object关键字用来修饰需要单例化的类。首先我们来看看Java如何实现单例,
代码如下:

Kotlin中的单例
上面示例代码通过Java实现单例,非常麻烦。在Kotlin中,只要通过object关键字就能实现单例,简洁高效。哪个类需要单例,就在该类名前添加object关键字即可。代码如下:

针对以上代码,创建单例对象的时候使用的是【Person】,而不是【Person()】,也就是去掉了括号。通过结果可以看出,单例类如果之前创建过对象,后面创建的对象将会指向之前创建的对象。所以,看到两个对象toString之后打印的结果一样。
我们继续让单例类带上属性,看看下面的案例能否去理解参考代码:

针对以上代码,感觉是两个独立的person1对象和person2对象,其实不是,因为我们的Person类通过了object关键字修饰,是一个单例。所以,才有了如下的结果。
创建匿名类对象
如果是做过android开发的同学,对点击事件的设置一点也不陌生。我们直接看如下代码:

setOnclickListener方法需要的是一个OnClickListener接口对象。实际在被调用的时候,我们传入了一个OnClickListener的匿名内部类对象。
Kotlin里面,没有匿名内部类,但是可以通过object关键字去完成。参考代码:

这里是实现了OnClickListener接口的对象。除了实现某一个接口,还可以继承某一个类,参考代码:

这里的对象【gougou】,可以理解为是基类的【Animal】的一个子类对象,我们通过重载方法,让基类的“吃吃吃...”,变成了具体的“吃骨头”。
object声明的对象,除了实现某一个接口、继承某一个类,还可以既不实现接口,也不继承类,参考代码:

创建伴生对象
我们知道Kotlin中成员方法的调用形式是【对象.方法()】。包级别函数的调用形式是【方法()】。那有没有【类.方法()】的形式呢?也就是类似java里面的静态方法的调用。答案是有的,通过companionobject关键字申明的伴生对象,方法或者属性调用的时候就是【类.方法()】、【类.属性】。
什么是伴身对象呢?也就是伴随在某一个类身上。定义的时候,定义在一个类的内部,参考案例:

这里的B就是A的伴身对象,只有在A创建的时候,对象B的实例才会创建。
伴身对象可以有自己的方法和属性,甚至可以实现接口,继承类。伴身对象内的方法访问可以有【外部类.内部类.方法()】的形式以及【外部类.方法()】。伴身对象内的属性访问可以有【外部类.内部类.属性】的形式以及【外部类.属性】,参考代码:
