Kotlin学习笔记二十五、内部类、匿名内部类

  • Post author:
  • Post category:其他




内部类

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



版权声明:本文为haoyuegongzi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。