天天看點

Kotlin學習筆記二十五、内部類、匿名内部類

内部類

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)方法。