零
一、 簡單的起因
事情是這樣的,小德在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開發的初學者,如果我有錯誤的地方或者不足的話歡迎大家指正。希望與大家一同進步。