Android筆記之Kotlin、Java的內部類?巢狀類?

druidZ發表於2018-12-14

Android筆記之Kotlin、Java的內部類?巢狀類?

一、 簡單的起因

事情是這樣的,小德在kotlin中寫了一個“內部類”(這地方表達有問題,看完之後再來看一下就清楚了),然後在外部建立了這個內部類,但是建立的方式有點奇怪:

class ClassA {
    init {
        Log.v("testcon", "A ")
    }
    class ClassB{
        init {
            Log.v("testcon", "B ")
        }
    }
}

.....
var innerClass = OuterClass.InnerClass()
複製程式碼

這個意思是..內部類的初始化不需要外部類?還是kotlin優化過。在檢視相關部落格和自己寫了測試之後確定了,不是kotlin優化了內部類,而是我的呼叫有問題->

二、 先看看傳統的Java中內部類

Java的內部類有個特點,建立內部類需要先例項化外部類,看測試:

public class TestA {
    public TestA() {
        Log.v("testcon", "A ");
    }

    class TestB {
        public TestB() {
            Log.v("testcon", "B ");
        }
    }
}
複製程式碼

建立TestB物件的時候要這麼寫:

TestA a = new TestA();
TestA.TestB b = a.new TestB();
複製程式碼

看的很清楚,要例項化A才能例項化B,結果當然也是 “A B”這樣的了 這不當然了

三、 kotlin中的“內部類”

和Java同樣的思路,我建立了“內部類”,但是例項化內部類的時候並不需要例項化外部類,這是?不是很像靜態內部類麼?
其實是和Java中相同的建立方法,我們建立的叫巢狀類,在kotlin中要是想要建立和Java一樣的內部類,需要加上inner關鍵字,像這樣:

class ClassA {
    init {
        Log.v("testcon", "A ")
    }
    inner class ClassB{
        init {
            Log.v("testcon", "B ")
        }
    }
}
複製程式碼

四、 所以巢狀類和內部類是?

可以這麼理解,在Java中,巢狀類是指在一個類中又寫了一個類,其中非靜態的巢狀類我們成為內部類,當然我們也有靜態內部類的說法,我們知道其中的意思就行,不用很嚴格(要是你們考試的話最好還是問下老師了)。
在靜態內部類中,內部類是不會有外部類的引用的,而非靜態內部類就需要持有外部類的引用了,所以在建立方式上有所不同。
在kotlin中有inner關鍵字就更清楚了,沒有inner的是巢狀類,沒有外部類的引用,可以使用最開始哪種方式建立,而有Inner關鍵字就說明是和Java中我們熟悉的內部類一樣用法了。
說到底還是kotlin沒仔細看,老是有Java的慣性思維

//作為Android開發的初學者,如果我有錯誤的地方或者不足的話歡迎大家指正。希望與大家一同進步。

Android筆記之Kotlin、Java的內部類?巢狀類?

相關文章