<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相比于Java | 相比于java | 描述??????????????????| | ------- | ------------------- | | 新增??????| 可以有頂層函數 | | 新增??????| 可以有嵌套函數 | | 新增??????| 可以有中綴函數 | ### 頂層函數 頂層函數也可以稱為包級別函數,就是**一個函數,可以直接放到某一個包里面,而不用一定需要放到某一個類里面**。在Java里面一個方法,必須屬于一個類,**在Kotlin中,方法可以獨立存在**。其實我們之前寫的很多函數都是頂層函數,比如我們的**main方法**: ![](https://box.kancloud.cn/50a5d9319c668768c358e53b7075b3d2_688x191.png) **頂層函數的定義顯得自由,不受類的約束**。頂層函數調用方法,如果在同一個包,直接調用即可,如果在不同包,導入對應的包就可以了。 我們寫個案例驗證下,先在“第2章開始.B變量和函數進階.頂層函數1”包下定義方法“sayHello2Kotlin”,參考代碼: ![](https://box.kancloud.cn/911b93c5dfaf7893a0435075a1aa5ea7_680x154.png) 接著在“第2章開始.B變量和函數進階.頂層函數2”包下定義方法“sayHello2Java”,參考代碼: ![](https://box.kancloud.cn/47a1cd6fc7b2af9202f3ed4c7b65fe9a_682x190.png) 接著我們在一個新文件中調用“sayHello2Kotlin”和“sayHello2Java”兩個方法。 ![](https://box.kancloud.cn/09d463467f2538f920dccfa7ca66d227_678x531.png) **我們雖然沒有寫具體的類,但是其實通過查看編譯轉換的字節碼,編譯器會幫我們生成了一個類**,比如我們查看“sayHello2Kotlin”方法對應的字節碼,參考截圖: ![](https://box.kancloud.cn/b45e145286b505cdf2cac1c29f5f0589_673x147.png) ### [成員函數](http://www.kotlincn.net/docs/reference/functions.html#%E6%88%90%E5%91%98%E5%87%BD%E6%95%B0) 在Kotlin中,除了頂層函數之外,**根據函數作用域還可以將函數分為成員函數、局部函數**。 成員函數是在類或對象內部定義的函數,成員函數的語法格式如下: ``` class類名{ fun 函數名(){ 執行語句 … } } ``` 在上述語法格式中,class是定義類的一個關鍵字。當在main()函數中調用成員函數時,需要使用“類的實例.成員函數()”的形式。 ``` class Person { //創建一個Person類 fun hello() { //定義一個成員函數 print("Hello") } } fun main(args: Array<String>) { var person: Person = Person() //創建Person類的實例 person.hello() //調用Person類中的成員函數hello() } ``` 運行結果 ``` Hello ``` ### 嵌套函數([局部函數](http://www.kotlincn.net/docs/reference/functions.html#%E5%B1%80%E9%83%A8%E5%87%BD%E6%95%B0)) 在Java里面,函數只能定義在某一個類里面,剛剛我們說了,**方法可以直接定義在一個包里面,獨立于一個類存在**。除此之外,**方法里面還可以還可以定義方法。這樣的方法稱為嵌套方法**。 ``` fun 函數名(){ fun 函數名(){ 執行語句 … } 執行語句 … } ``` 假如我們有這樣一個場景,保存用戶之前需要校驗用戶名和密碼是否為空。如果不使用嵌套函數,我們可以這樣實現,參考代碼: ![](https://box.kancloud.cn/60d671a370e727fd526e59afd0e24120_685x724.png) 針對檢驗方法“**validate**”,我們這里使用的是頂層函數的形式,放在了最外面。 接著我們**把該方法直接挪動到saveUser方法里面**,參考代碼: ![](https://box.kancloud.cn/ac03633367663124405f3c959aeb4324_684x716.png) 針對以上代碼,發現方法定義挪動了某一個方法里面同樣是可以的。 示例 ``` fun main(args: Array<String>) { total(3) //調用sum()函數,傳遞實參為3 } fun total(a: Int) { //定義一個函數sum() var b: Int = 5 //定義一個變量b,并將其初始值設置為5 fun add(): Int { //定義個局部函數add() return a + b //返回變量a與b的和 } println(add()) } ``` 運行結果 ``` 8 ``` 由上述代碼可知,局部函數可以訪問外部函數的局部變量,并且在外部函數中可以調用其內部的局部函數。 ### 中綴函數 **一個函數為成員函數或者拓展函數,并且只有一個參數,并且使用infix修飾**。 在進行函數調用的時候可以使用中綴方式調用,參考代碼: ![](https://box.kancloud.cn/1dfc2ed0ddcf403de4841b264b1cd0ec_690x718.png) #### **擴展[中綴表示法](http://www.kotlincn.net/docs/reference/functions.html#中綴表示法)** 標有`infix`關鍵字的函數也可以使用中綴表示法(忽略該調用的點與圓括號)調用。中綴函數必須滿足以下要求: * 它們必須是**成員函數**或[擴展函數](http://www.kotlincn.net/docs/reference/extensions.html); * 它們**必須只有一個參數**; * 其參數不得[接受可變數量的參數](http://www.kotlincn.net/docs/reference/functions.html#可變數量的參數varargs)且不能有[默認值](http://www.kotlincn.net/docs/reference/functions.html#默認參數)。 ``` infix fun Int.shl(x: Int): Int { …… } // 用中綴表示法調用該函數 1 shl 2 // 等同于這樣 1.shl(2) ``` 中綴函數調用的優先級低于算術操作符、類型轉換以及`rangeTo`操作符。 以下表達式是等價的: * `1 shl 2 + 3`與`1 shl (2 + 3)` * `0 until n * 2`與`0 until (n * 2)` * `xs union ys as Set<*>`與`xs union (ys as Set<*>)` 另一方面,中綴函數調用的優先級高于布爾操作符`&&`與`||`、`is-`與`in-`檢測以及其他一些操作符。這些表達式也是等價的: * `a && b xor c`與`a && (b xor c)` * `a xor b in c`與`(a xor b) in c` 完整的優先級層次結構請參見其[語法參考](http://www.kotlincn.net/docs/reference/grammar.html#expressions)嗎,或者參考本系列操作符和特殊符號章節。 >[info]請注意,中綴函數總是要求指定接收者與參數。當使用中綴表示法在當前接收者上調用方法時,需要顯式使用`this`;不能像常規方法調用那樣省略。這是確保非模糊解析所必需的。 ``` class MyStringCollection { infix fun add(s: String) { …… } fun build() { this add "abc" // 正確 add("abc") // 正確 add "abc" // 錯誤:必須指定接收者 } } ```
                  <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>

                              哎呀哎呀视频在线观看