<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 嵌套類/內部類 [TOC] 我們在Kotlin內部還可以定義類,這樣的類,我們可以稱為嵌套類(nestedclasses)。**嵌套類分成兩種類型,一種是不通過Inner關鍵字修飾的嵌套類,一種是通過Inner關鍵字修飾的嵌套類(也稱為內部類)**。兩者的**區別主要體現在類的創建以及對外部內屬性的訪問上**。 Kotlin中的**嵌套類是指可以嵌套在其他類中的類,該類不能訪問外部類的成員,內部類指的是可以用inner標記以便能夠訪問外部類的成員**。Kotlin中的內部類與嵌套類與Java中的類似,不同的是在沒有任何修飾的情況下,定義在一個類內部的類被默認稱為嵌套類,不持有外部類的引用,如果想將它聲明為一個內部類,則需要加上inner修飾符。 ### **嵌套類** 我們先看**不通過Inner關鍵字修飾的嵌套類,這樣的嵌套類,不能訪問外部類的成員屬性,這樣的嵌套類,在創建的時候,不需要先創建外部類對象**。參考代碼: ![](http://upload-images.jianshu.io/upload_images/7368752-791c1baa7c48e6ec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 針對以上代碼我們看第11行**創建嵌套類對象的時候,不用先創建外部類對象。同時,嵌套類不能訪問外部類成員屬性**,參考代碼: ![](http://upload-images.jianshu.io/upload_images/7368752-6d9367ee28d98c85.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 示例: ~~~ class Outer { var outerVal = 10 fun myFun() { println("outer") } class Nested { //嵌套類不能訪問外部類成員,相當于java的static 靜態內部類 fun myFun(): Unit { println("Nested") } } } fun main(args: Array<String>) { //創建嵌套類Nest對象,不需要外部類Outer對象 val nested = Outer.Nested() nested.myFun() } ~~~ 運行結果 ``` Nested Process finished with exit code 0 ``` ### **內部類** 通過上一小節的學習,我們會發現在嵌套類中是無法訪問外部類中成員的,這樣定義的嵌套類在實際開發中沒有任何意義,為此,Kotlin中提供了內部類,內部類只需要在嵌套類的基礎上添加一個“inner”關鍵字即可,將其標識為內部類。 我們再看通過Inner關鍵字修飾的嵌套類,這樣的嵌套類(內部類),**能訪問外部類的成員屬性**,這樣的嵌套類,**在創建的時候,需要先創建外部類對象**。參考代碼: ![](http://upload-images.jianshu.io/upload_images/7368752-679f1af03d714cab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 示例 ~~~ class Outer1 { private var outerVal = 10 fun myFun() { println("outer") } //內部類可以訪問外部類成員,可看作外部類對象的一個成員(即便是private) inner class Inner { fun myFun(): Unit { println("Inner" + "可以訪問到的外部類的私有成員outerVal:${outerVal}") } } } fun main(args: Array<String>) { var outer = Outer1(); var inner = outer.Inner();//創建內部類Inner對象,需要外部類Outer對象 //var inner1 = Outer.Inner();//這里會報錯 //調用方法 outer.myFun() inner.myFun() } ~~~ 運行結果 ``` outer Inner可以訪問到的外部類的私有成員outerVal:10 Process finished with exit code 0 ``` ### **匿名內部類** 用[對象表達式](http://www.hmoore.net/alex_wsc/android_kotlin/1318311),創建匿名內部類的實例: ~~~ window.addMouseListener( object: MouseAdapter() { override fun mouseClicked(e: MouseEvent) { ... } override fun mouseEntered(e: MouseEvent){ ... } } ) ~~~ >[success]**注**:對于 JVM 平臺, 如果對象是函數式 Java 接口(即具有單個抽象方法的 Java 接口)的實例, 你可以使用帶接口類型前綴的lambda表達式創建它。 當接口僅有一個接口方法/函數,可用lambda表達式省略接口方法/函數: ~~~ val listener = ActionListener{ println("clicked") //lambda表達式-簡化的匿名內部類 } ~~~ **參考**: * [創建匿名類對象](http://www.hmoore.net/alex_wsc/android_kotlin/1037838#_20) * [匿名內部類](http://www.hmoore.net/alex_wsc/android_kotlin/1318309#_26) ### Java中的嵌套類和內部類與Kotlin中的區別 * (1)在Java中,將一個類定義在另一個類的內部,則稱這個類為成員內部類,如果成員內部類加上static修飾,則是稱為靜態內部類。Java中成員內部類中可以訪問外部類的所有成員。 * (2)在Kotlin中,將一個類定義在另一個類的內部,不加任何修飾符,則這個類將被默認為是一個嵌套類,如果加上inner修飾,則是一個內部類。Kotlin中的內部類可以訪問外部類中的變量,而嵌套類卻不可以訪問。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看