Kotlin 笔记:内部类与嵌套类

本文详细对比了Kotlin与Java中嵌套类、内部类及匿名内部类的使用方式与特性。Kotlin的嵌套类默认不访问外部类,而内部类需添加inner关键字才能访问;Java则相反,默认形式的类可以访问外部类,需添加static关键字来创建不持有外部类引用的静态内部类。文章还介绍了Kotlin中使用object关键字创建匿名内部类的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、与 Java 的对比

形式 \ 语言KotlinJava
一个 class 内声明另一个 class嵌套类内部类
inner内部类
static静态内部类
名称含义
内部类(Java、Kotlin)持有外部类的引用
嵌套类(Kotlin)不持有外部类的引用
静态内部类(Java)不持有外部类的引用

二、嵌套类

形式:没有关键词,直接在其他类内部声明。

这种形式是最普遍的形式,因为没有其他关键字进行修饰,可以称为默认形式。

Java 比较开放,认为默认形式的类可以访问外部类。

Kotlin 比较封闭,认为默认形式的类不能访问外部类。

class Outer {
    private val bar: Int = 1
    class Nested {
        fun foo() = 2
    }
}

val demo = Outer.Nested().foo() // == 2

三、内部类

形式:在嵌套类的基础上添加 inner 关键字。

Kotlin 的默认形式不能访问外部,要想访问,需要额外添加一个 inner 关键字。

Java 的默认形式可以访问外部,要想不访问,需要额外添加一个 static 关键字。

class Outer {
    private val bar: Int = 1
    inner class Inner {
        fun foo() = bar
    }
}

val demo = Outer().Inner().foo() // == 1

四、匿名内部类

匿名内部类与 inner 就没有关系了,需要使用 object 关键字。

window.addMouseListener(object : MouseAdapter() {

    override fun mouseClicked(e: MouseEvent) { ... }

    override fun mouseEntered(e: MouseEvent) { ... }
})

如果匿名内部类只有一个方法,可以简化为一个 lambda 表达式。

val listener = ActionListener { println("clicked") }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值