内部類
class NestedDemo {
var mNested = "NestedDemo"
fun funNested(){
println("funNested()")
}
class Outer {
private val zero = 0
val one = 1
fun outerFun():Int{
return 1
}
class InnerrrClasses {
fun getTwo() = 2
var innerValue= 2
inner class ChildClasses{
val three = 3
fun getThreeValue():Int{
println("試試擷取外部變量:innerValue==$innerValue")
return 3
}
}
}
}
}
在kotlin裡面,被關鍵字“inner”修飾的類即為内部類。
然後在其他類裡面的用法:
var mNested = NestedDemo().mNested
NestedDemo().funNested()
var outerOne = NestedDemo.Outer().one
var outerFun = NestedDemo.Outer().outerFun()
var innerTwo = NestedDemo.Outer.InnerrrClasses().getTwo()
var childThree = NestedDemo.Outer.InnerrrClasses().ChildClasses().three
var threeValue = NestedDemo.Outer.InnerrrClasses().ChildClasses().getThreeValue()
println("mNested===$mNested, outerOne===$outerOne, outerFun===$outerFun,
innerTwo===$innerTwo, childThree===$childThree, threeValue===$threeValue")
“NestedDemo .kt”内部的變量和類,以及内部類的通路規則:
1、調用普通類(NestedDemo.kt)裡面的變量和方法是通過“該類的對象執行個體.方法/變量”的思維去調用,就比如上面我們調用NestedDemo類裡面的變量“mNested”以及“funNested()”方法;
var mNested = NestedDemo().mNested
NestedDemo().funNested()
2、調用調用普通類(NestedDemo.kt)裡面的未經“inner”關鍵字修飾的内部類,則是直接使用“類名.xxx”的格式調用,就如上面我們調用NestedDemo類裡面未經inner關鍵字修飾的“Outer.kt”内部類:
NestedDemo.Outer()
3、調用調用普通類(NestedDemo.kt)裡面的有“inner”關鍵字修飾的内部類的變量或方法,則是:
外部類類名.inner修飾的内部類的對象執行個體.方法/變量。比如:
var childThree = NestedDemo.Outer.InnerrrClasses().ChildClasses().three
var threeValue = NestedDemo.Outer.InnerrrClasses().ChildClasses().getThreeValue()
匿名内部類
fun main(args: Array<String>) {
var obj = object : Runnable,Executor{
override fun run() {
println("object : Runnable---->>>run()")
}
override fun execute(command: Runnable) {
println("object : Cloneable---->>>execute(command: Runnable)")
}
obj.run()
obj.execute(obj)
}
上面的obj其實是Runnable接口和Executor接口的複合體。
kotlin裡面的匿名内部類支援同時實作兩個接口的匿名内部類,并分别實作方法。比如上面obj 執行個體實作了Runnable接口和Executor接口兩個接口,并同時實作了他們的方法:
run()和execute(command: Runnable)
然後我們在後面分别調用執行:
obj.run()調用的是Runnable接口的run方法。
obj.execute(obj)調用的是Executor接口的execute(command: Runnable)方法。