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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值