84.Kotlin|84.Kotlin object 和 companion object

【84.Kotlin|84.Kotlin object 和 companion object】object EightyFourActivity {
/**
*
* 每天一个知识点day84 TODO Kotlin object 和 companion object
* https://www.jianshu.com/p/a8d1877143b2
* https://www.jianshu.com/p/14db81e1576a
* object
* object声明不能用在方法和inner内部类中,但是能嵌套在其他object声明和嵌套类中。
* object表达式是在使用的地方立即被初始化和执行的,
* 因此object不能有定义构造函数,
*
*
* kotlin中object关键字可以表示两种含义
* 1.对象表达式
* 匿名内部类的写法
* textView.setOnClickListener(object : OnClickListener {
* override fun onClick(p0: View?) {
* Toast.makeText(this@TestActivity, "点击事件生效", Toast.LENGTH_LONG)}})
*
* 2.对象声明
* 用object修饰的类为静态类,里面的方法和变量都是静态的。
* 直接声明类
* object ObjTest{
* fun getA(){}
* }
* 静态内部类
* class Test{
* object InnerClass{
*
* }
* }
* 没有被inner 修饰的内部类都是静态的
* 如果需要在java中调用ObjTest的getA方法就是ObjectTest.INSTANCE.getA()
*
*
* companion object
* companion object修饰为伴生对象,伴生对象在类中只能存在一个,可以给伴生
* 对象起个名字来调用,否则就直接用Companion调用
* companion object里面调用不到外部的成员变量,因为companion object相当于静态类
* class ComClass{
* companion object{
* fun getObj(){}
* }
* }
* 在java中调用为ComClass.Companion.getObj()
* class ComClass{
* companion object AAB{
* fun getObj(){}
* }
* 在java中调用为ComClass.AAB.getObj()
*
* 总结:
* 1.object表达式是在使用的地方立即被初始化和执行的。
* 2.object声明一个类是延迟加载,只有当第一次被访问的时候才会初始化,
* 所以用来实现单例,
* 3.companion object是当包含他的类被加载时就初始化了,这点和java的static还是一样的。
* 官方并不建议我们滥用object关键字,因为他不利于控制也不易于测试,毕竟他会在声明时就
* 初始化,一般情况下我们使用object就是匿名内部类和单例,而companion object一般用来
* 声明静态域。
*
*
*/

@JvmStatic fun getObj() { ComObjClass.OBJCC.get() }val objA: String? = null

}
class ComObjClass {
val tv: TextView? = nullfun ss() { tv.let {} }companion object {val c: String = "-----" const val cc:String = "----"@JvmStatic val mComObj: String? = nullfun getc(){ c.toString() }}val objB: String? = nullobject OBJCC { fun get() {} }

}
class StaticDemoActivity {
companion object {
const val LOAN_TYPE = "loanType"
const val LOAN_TITLE = "loanTitle"
}
object A{
}
inner class SCS{ }

}

    推荐阅读