Kotlin学习笔记——类嵌套与内部类

嵌套类

在一个类的内部声明一个类,叫做类嵌套。

class Outer(var name: String) {

    class Inner(var log: Double, var lat: Double) {
        fun print() {
            println(name) // 嵌套类调用外部的属性,这里会编译报错
        }
    }
}

内部类

声明为inner的嵌套类叫做内部类,内部类可以调用外部类的属性,但是嵌套类却不行。

class Outer(var name: String) {

    inner class Inner(var log: Double, var lat: Double) {

        fun print() {
            println(name) // 只有内部类才能访问外部类,如果嵌套类没有声明为inner,会编译报错
        }
    }
}

匿名内部类

匿名内部类,就是在一个类内部,直接实例化一个类对象当做参数的类

class Outer(var name: String) {

    fun main(args: Array<String>) {
        setListener(object : Listener { // 内部类类型是接口,无需带括号,因为没有构造函数
            override fun onChange() {
                TODO("not implemented")
            }
        })
    }
}

interface Listener {

    fun onChange()
}

匿名内部类需要注意的几个事项

  • 使用时,实例化采用object关键字,使用冒号后面紧跟着内部类;
  • 如果匿名内部类类型是一个接口(interface),那么接口名后面无需带括号(如上示例)
  • 如果内部类类型是抽象类(abstract class),那么接口名后面需要带括号,必要时需要带参数
class Outer(var name: String) {

    fun main(args: Array<String>) {
        setListener(object : Listener() { // 内部类类型是抽象类,有构造函数,需要带括号,必要时需要参数
            override fun onChange() {
                TODO("not implemented")
            }
        })
    }
}

abstract class Listener {

    abstract fun onChange()
}
  • 如果内部类类型是普通类,那么该类必须是open的,如果需要重新里面的方法,重写的方法也必须是open
class Outer(var name: String) {

    fun main(args: Array<String>) {

        setT(object : T(){ // 这里需要带括号,T类必须是open的,
            override fun t() { // 所覆盖的方法也必须是open的

            }
        })
    }

    fun setT(t: T) {

    }
}

open class T {
    open fun t() {

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值