美文网首页
Kotlin内部类、嵌套类

Kotlin内部类、嵌套类

作者: wind_sky | 来源:发表于2019-07-26 14:45 被阅读0次

1. 嵌套类

//嵌套类
class Outer1 {
    private var value = 1

    class Inner1{
        private var inValue = 2

        fun method() {
            // println(value)       //嵌套类无法直接访问外部类属性
            println(Outer1().value) //但可以通过外部类的对象访问,因为有private修饰符,普通类通过对象也无法访问
        }
    }
    fun func() {
        // println(inValue)         //外部类无法直接访问嵌套类的属性
        // method()                 //和方法
 
        // println(Inner1().inValue)//外部类无法通过嵌套类的对象访问private属性,但是可以访问public
    }
}
 
//实例化嵌套类
val inn = Outer1.Inner1()

2. 内部类

 //内部类
class Outer2 {

    private var value1 = 233

    inner class Inner2 {                //声明内部类需要使用inner关键字
        private var inValue = 666

        fun method() {
            println(value1)             //内部类可以直接访问外部类属性
            func()                      //和方法
        }
    }

    private fun func() {
        // println(inValue)             //外部类无法直接访问内部类的属性
        // println(Inner2().inValue)    //也无法通过内部类的对象访问内部类的私有域,但在Java中可以
    }
}
 
//实例化内部类,需要借助外部类对象,同Java
val out = Outer2()
val inn = out.Inner2()

3. 匿名内部类

//匿名内部类
interface DoSomething {
    fun dooo()
}
class Outer3 {
    private val value = "i am outer value"

    private val hhh = object : DoSomething {    //Kotlin中写匿名内部类需要借助object关键字
        override fun dooo() {
            println(value)                      //同样可以访问外部类的属性和方法
        }
    }
}

4. 局部内部类

//局部内部类
class Outer4 {
    private var out = 233
    fun func() {
        val value = "hhhhh"
        
        class Inner4 {
            private var inner = 666
            fun method() {
                println(value)          //可以访问外部类的属性,但必须为final 同Java
                println(out)            //可访问方法中定义的变量,亦为final
            }
        }
    }
    
    fun hhh() {                         //外部类无法访问到内部类,因为生命周期和作用域的关系
        // println(inner)
        // println(Inner4().inner)
        // println(Outer4().Inner4())
        // println(Outer4.Inner4())
    }
} 

5. 总结:

通过上面的实际演示和各类之间的表现,我们可以知道,Kotlin中的嵌套类就相当于Java中的静态内部类,inner关键字修饰的内部类相当于Java中的非静态内部类,匿名内部类和局部内部类性质都和Java类似。

其中匿名内部类有些时候可以用lambda表达式简化。

相关文章

网友评论

      本文标题:Kotlin内部类、嵌套类

      本文链接:https://www.haomeiwen.com/subject/tptdrctx.html