Kotlin学习(十二)——嵌套类和内部类(很简单,内部类和Java几乎一样)

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的单抽象函数的接口,结果不成功)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值