Kotlin-嵌套类_内部类_匿名内部类
Kotlin-嵌套类&内部类&匿名内部类
1. 嵌套类
类可以被嵌套在其它类中:
class Outer {
private val bar: Int = 1
class Nested {
fun foo() {
println("foo in Outer#Nested#foo() ")
}
fun test() {
// println("Nested: bar value: $bar") // 报错:Unresolved reference: bar
}
}
}
fun main() {
Outer.Nested().foo()
}
运行:
foo in Outer#Nested#foo()
注意:嵌套类不能访问外部类的成员变量,方法
test()
是无法执行的,编译器会报错:Unresolved reference: bar
。
您还可以使用带有嵌套的接口。类和接口的所有组合都是可能的:您可以在类中嵌套接口、在接口中嵌套类、以及在接口中嵌套接口。
interface OuterInterface {
class InnerClass
interface InnerInterface
}
class OuterClass {
class InnerClass
interface InnerInterface
}
上述语法结构在kotlin中都是允许的。
2. 内部类 inner class
class Outer {
private val bar: Int = 1
class Nested {
fun foo() {
println("foo in Outer#Nested#foo() ")
}
fun test() {
// println("Nested: bar value: $bar") // 报错:Unresolved reference: bar
}
}
inner class Inner {
fun foo() {
println("foo in Outer#Inner#foo() ")
}
fun test() {
println("Inner: bar value: $bar")
}
fun test2() {
val outer = this@Outer // 获取外部类的引用
println("outer: $outer")
}
}
}
fun main() {
Outer.Nested().foo()
Outer().Inner().foo()
Outer().Inner().test()
Outer().Inner().test2()
}
运行:
foo in Outer#Nested#foo()
foo in Outer#Inner#foo()
Inner: bar value: 1
outer: com.yongdaimi.kotlin.Outer@2503dbd3
kotlin中的内部类使用 inner class
关键字来修饰,内部类是可以访问外部类的成员的(包括成员函数和成员属性),如 Outer().Inner().test()
方法,且内部类也可以获取外部类的引用,使用 this@外部类名
的语法,
注意:调用内部类方法时,不能使用 Outer.Inner().foo()的语法:
外部类必须加上括号。
3. 匿名内部类
匿名内部类使用object 表达式创建,即:object: 类名()
的形式:
package com.yongdaimi.kotlin
class Outer {
private val bar: Int = 1
class Nested {
fun foo() {
println("foo in Outer#Nested#foo() ")
}
fun test() {
// println("Nested: bar value: $bar") // 报错:Unresolved reference: bar
}
}
inner class Inner {
fun foo() {
println("foo in Outer#Inner#foo() ")
}
fun test() {
println("Inner: bar value: $bar")
}
fun test2() {
val outer = this@Outer // 获取外部类的引用
println("outer: $outer")
}
}
abstract class BaseAdapter {
abstract fun getPosition(position: Int)
}
fun setAdapter(adapter: BaseAdapter) {
}
}
fun main() {
Outer.Nested().foo()
Outer().Inner().foo()
Outer().Inner().test()
Outer().Inner().test2()
val outer = Outer()
outer.setAdapter(object : Outer.BaseAdapter() {
override fun getPosition(position: Int) {
}
})
}
上文的 object : Outer.BaseAdapter()
就是一个匿名内部类。
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
分类:
Kotlin-语法特性
标签:
inner class
, 内部类
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库