<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### **?(可空類型變量)** 我們需要知道,Kotlin把變量分成了兩種類型,一種是不可空類型,一種可空類型。**變量默認是非空類型,除非顯示地把它標記為可空**。那可空類型變量怎么定義呢?**只需在變量類型后面加上一個問號,變量就變成了可空類型變量**,當某個變量的值可以為空時,必須在聲明處的數據類型后添加“?”來標識該引用可為空。參考代碼: ~~~ fun main(args: Array<String>) { //非空類型變量 var price: String //可空類型變量 var age: String? } ~~~ 針對以上代碼,其中price是非空類型變量,其中age是可空類型變量。 1. Kotlin官方約定變量默認為非空類型時,該變量不能賦值為null,age為null時,編譯可以通過。 2. 在使用可空變量時,如果不知道該變量的初始值,則需要將其賦值為null,否則會報“variable 'age' must be initialized”異常。 >[info]注意:問號可以加在任何類型的后面來表示這個類型的變量可以存儲null引用:String?、Int?、MyCustomType?等等,沒有問號的類型表示這種類型的變量不能存儲null 引用。這說明所有常見類型默認都是非空的,除非顯式地把它標記為可空。 一旦你有一個可空類型的值,能對它進行的操作也會受到限制,比如不能再隨意調用它的方法,也不能把它賦值給非空類型的變量,也不能把可空類型的值傳給擁有非空類型參數的函數;最重要的操作就是和null 進行比較。而且一旦你進行了比較操作,編譯器就會記住,并且在這次比較發生的作用域內把這個值當作非空來對待。 **一、不可空變量不能賦值為null**,如果我們給price以及age兩個變量都賦值為null,將出現編譯錯誤,參考截圖: ![](https://i.loli.net/2019/04/20/5cba08e7319be.png) 可以看到,代碼提示`“Null can not be a value of a non-null type String”`也就是“**非空類型的String不能賦值為null**”。 **二、可空類型變量不能直接使用**,如果我們直接使用可空類型變量age,則會出現如下的編譯錯誤,參考代碼: ![](https://i.loli.net/2019/04/20/5cba096ea4b4f.png) 是的,編譯的時候錯誤提示`“Only safe(?.) or non-null asserted(!!.) calls are allowed ona nullable receiver of type String?”`,也就是“**可以通過安全調用符(?.)或者非空斷言(!!.)直接去使用可空類型的變量**”。 這里其實編譯器幫我們提示了2種做法。其實想要使用可空類型變量,總結起來使用3種方式的,匯總如下: * 方式1:使用非空判斷 * 方式2:使用安全操作符“?.” * 方式3:使用非空斷言"!!" **使用非空判斷使用可空類型變量**,比如針對上面代碼,我們在使用age變量的時候通過非空判斷去使用,參考如下: ~~~ fun main(args: Array<String>) { //非空類型變量 var price: String //可空類型變量 var age: String? = null //直接使用age //非空判斷,Java里面的做法 if (age != null) { age.toInt() } } ~~~ 可以看到,編譯通過了。因為**Kotlin約定“如果一個變量,進行了非空判斷,該變量的類型就變成了非空類型"**。”也**就是經過了代碼的9行,到了代碼的10行,編譯器會認為age變量是不可空類型變量了**。 雖然非空判斷,就可以使用可空類型的變量了,但是如果都用非空判斷,代碼里面將會出現大量的非空判斷。這樣的代碼看起來就很像java的做法了。【**Kotlin相比于Java,代碼中減少了非空判斷的使用**】。那毫無疑問,**不用非空判斷,就需要用到Kotlin提供的安全調用符或者非空斷言**。 >[info]注意:可空的和非空的對象在運行時沒有什么區別;可空類型并不是非空類型的包裝。所有的檢查都發生在編譯期。這意味著使用Kotlin 的可空類型并不會在運行時帶來額外的開銷。 示例 ``` fun main(args: Array<String>) { var name: String = "Tom" //非空變量 var telephone: String? = null //可空變量 if (telephone != null) { print(telephone.length) } else { telephone = "18800008888" print("telephone =" + telephone) } } ``` 運行結果 ``` telephone =18800008888 ```
                  <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>

                              哎呀哎呀视频在线观看