美文网首页
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