kotlin和Java不一样的是,Java只有内部类,而Kotlin除了内部类还有嵌套类。
嵌套类
class Outer{
class Nest {
fun foo() = 2
}
}
//嵌套类类似于java的静态内部类,使用方式如下
fun main(args: Array<String>) {
var a = Outer.Nest().foo() //创建嵌套类的方式,和Java创建静态内部类的方式一样
println(a)
}
内部类
内部类和嵌套类不同,要使用inner关键字修饰。
//内部类的定义方式如下
class Outer{
inner class Inner{
fun foo()=3
}
}
fun main(args: Array<String>) {
var b = Outer().Inner().foo() //这里是内部类的创建对象方式
println(b)
}
注意内部类访问外部内要加限定符。
class Outer{
var i = 0
inner class Inner{
var i = 1
fun foo()=3
fun getOuterI() = this@Outer.i //如果要访问外部类的变量要加限定符,为了消除歧义
fun getInnerI() = this.i //默认不加限定符的情况下,访问的是本类对象中的变量
}
}
fun main(args: Array<String>) {
var b = Outer().Inner().foo() //这里是内部类的创建对象方式
var i = Outer().Inner().getOuterI()
var i1 = Outer().Inner().getInnerI()
println(b)
println(i) //输出0
println(i1) //输出1
}
更要注意外部类对内部类的可见性:
Kotlin 中外部类不能访问内部类的 private 成员。
匿名内部类
Java中创建匿名内部类new一个接口或者抽象类就好了,但是在Kotlin中是使用对象表达式,但是对象表达式要继承某一个接口或者抽象类
abstract class AbTest{
abstract fun foo()
}
fun main(args: Array<String>) {
var imp = object : AbTest(){ //对象表达式实现接口或抽象类
override fun foo() {
println("this is a no name class")
}
}
imp.foo()
}
如果要实现的是Java的函数式接口,可以使用lambda表达式,特别要注意,是Java的函数式接口,不是Kotlin的,Kotlin也是没有函数式接口的
//Java
public interface InterTest {
void foo();
}
Kotlin中使用lambda表达式实现:
//kotlin
fun main(args: Array<String>) {
var intertest = InterTest { println("this is my foo") } //实现Java函数式接口的时候,可以省略object:
intertest.foo()
}
结语:本篇小编觉得都很容易,除了被实现函数式接口的地方难住之外(小编以为Kotlin也有函数式接口,尝试着用Lambda表达式去实现Kotlin的单抽象函数的接口,结果不成功)