之前寫了一篇Kotlin中常量和靜態(tài)方法的文章窒盐,最近有人提出一個問題,在
companion object
中調(diào)用外部的成員變量會調(diào)用不到,這才意識到問題,本篇文章會帶著這個疑問來解決問題岖是。
一帮毁、 object關(guān)鍵字
object
關(guān)鍵字可以表達兩種含義:一種是對象表達式
,另一種是 對象聲明
。
1豺撑、對象表達式
繼承一個匿名對象
val textView = findViewById<TextView>(R.id.tv)
textView.setOnClickListener(object : OnClickListener {
override fun onClick(p0: View?) {
Toast.makeText(this@TestActivity, "點擊事件生效", Toast.LENGTH_LONG)
}
})
上面代碼其實就是我們經(jīng)常要給 view
設(shè)置的點擊事件,OnClickListener
事件是一個匿名類的對象黔牵,用object
來修飾聪轿。
2、對象聲明
用object
修飾的類為靜態(tài)類猾浦,里面的方法和變量都為靜態(tài)
的陆错。
2.1 直接聲明類
object DemoManager {
private val TAG = "DemoManager"
fun a() {
Log.e(TAG,"此時 object 表示 聲明靜態(tài)內(nèi)部類")
}
}
2.2 聲明靜態(tài)內(nèi)部類
類內(nèi)部的對象聲明,沒有被inner
修飾的內(nèi)部類都是靜態(tài)的
class DemoManager{
object MyObject {
fun a() {
Log.e(TAG,"此時 object 表示 直接聲明類")
}
}
}
如果需要調(diào)用 a()
方法
kotlin中調(diào)用
fun init() {
MyObject.a()
}
java中調(diào)用
MyObject.INSTANCE.a();
二金赦、companion object
companion object
修飾為伴生對象,伴生對象在類中只能存在一個音瓷,類似于java中的靜態(tài)方法 Java 中使用類訪問靜態(tài)成員,靜態(tài)方法夹抗。
companion object {
private val TAG = "DemoManager"
fun b() {
Log.e(TAG,"此時 companion objec t表示 伴生對象")
}
}
kotlin 中調(diào)用
fun init(){
b()
}
java 中調(diào)用
DemoManager.Companion.b();
companion object
相關(guān)的內(nèi)容可以查閱 Kotlin中常量和靜態(tài)方法 這篇文章绳慎,在這里不多在具體描述。
三漠烧、在companion object中如何調(diào)用外部的成員變量
3.1 為什么companion object
中調(diào)用不到外部成員變量
class DemoManager {
private val MY_TAG = "DemoManager"
fun init(){
b()
}
companion object {
fun b() {
Log.e(MY_TAG,"此時 companion objec t表示 伴生對象")
}
}
}
在上面代碼中MY_TAG
是不會被調(diào)用到的杏愤。
原理很簡單:
在java中我們寫一個靜態(tài)方法,如果需要調(diào)用成員變量已脓,是無法調(diào)用到的
private String TAG = "MainActivity";
public static void init(){
Log.e(TAG,"init() ");
}
只有將 TAG
修改為靜態(tài)成員變量
才能調(diào)用到
private static String TAG = "MainActivity";
public static void init(){
Log.e(TAG,"init() ");
}
由此可以看出來珊楼,java中靜態(tài)方法調(diào)用成員變量,要求成員變量必須是靜態(tài)的
度液, 在kotlin 中也是一樣厕宗,所以當companion object
中調(diào)用非靜態(tài)的成員變量也是調(diào)用不到的。
3.2 怎樣解決才能調(diào)用到呢堕担?
companion object {
private val MY_TAG = "DemoManager"
fun b() {
Log.e(MY_TAG,"此時 companion objec t表示 伴生對象")
}
}
將所引用的成員變量也修飾靜態(tài)的已慢,這樣就可以引用到了。
最后照宝,希望此篇博客對大家有所幫助蛇受,歡迎提出問題及建議共同探討,如有興趣可以關(guān)注我的博客厕鹃,謝謝兢仰!