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

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ![](https://box.kancloud.cn/3a6d32535b6549fcadfce0dd820e63af_1041x456.png) ## Kotlin之變量用法 [TOC] Kotlin變量的聲明方式與Java中聲明變量有很大的區別,而且**必須使用var或val關鍵字**。其中: * var:用此關鍵字聲明的變量表示**可變變量**,即可讀且可寫。相當于Java中普通變量 * val:用此關鍵字聲明的變量表示**不可變變量**,即可讀且不可寫。相當于Java中用final修飾的變量 ### 一、基礎用法 **定義格式: 關鍵字 變量名: 數據類型 = xxx** 示例:(例:這是在頂層聲明的時候) ~~~ fun main(args: Array<String>) { //立即初始化 var var_a: Int = 10 //推導出類型 var var_b = 5 //沒有初始化的時候,必須聲明類型,注意這里是局部變量,如果是函數中的變量,類中的變量,必須初始化。 var var_c: Float var_c = 12.3f var_c += 1 println("var_a => $var_a \t var_b => $var_b \t var_a => $var_c") //立即初始化 val val_a: Int = 100 //推導出類型 val val_b = 50 //沒有初始化的時候,必須聲明類型 val val_c: Int val_c = 1 // val_c += 1 因為c是不可變變量,所以這句代碼是會報錯的 println("val_a => $val_a \t val_b => $val_b \t val_c => $val_c")//`$`符號表示引用的意思,理解為字符串模板 } ~~~ 輸出結果: ~~~ var_a => 10 var_b => 5 var_a => 13.3 val_a => 100 val_b => 50 val_c => 1 ~~~ ### 二、類中聲明變量以及聲明可空變量 #### 2.1類中聲明變量 上面的是演示變量的基礎定義。而且只有在頂層聲明的情況下是可以不用實例化的。但是在實際開發當中,一般都是在一個類中去定義變量,這種情況被稱為聲明類的屬性。這里講解其聲明的特點并實例分析。 其特點如下:**必須初始化,如果不初始化,需使用lateinit關鍵字。參考[三、后期初始化與延遲初始化](http://www.hmoore.net/alex_wsc/android_kotlin/1037791#_103)** >[info] 注意:kotlin中的類和Java中的有很大的不同,詳情還請具體參考類專屬章節 示例代碼如下 ~~~ fun main(args: Array<String>) { classVariable() } /** * 在類中,變量的定義及使用 */ fun classVariable() { class Test1 { // 定義屬性 var var_a: Int = 0 val val_a: Int = 0 // 初始化 init { var_a = 10 // val_a = 0 為val類型不能更改。 println("var_a => $var_a \t val_a => $val_a") } } Test1() class Test2 { // 聲明可空變量 var var_a: Int? = 0 val val_a: Int? = null init { var_a = 10 // val_a = 0 為val類型不能更改。 println("var_a => $var_a \t val_a => $val_a") } } Test2() } ~~~ 輸出結果 ~~~ var_a => 10 val_a => 0 var_a => 10 val_a => null ~~~ #### 2.2 聲明可空變量 在Java中,當我們聲明一個變量不必關心這個變量是否為空,在使用這個變量的時候幾乎上都會判斷其是否為空來增加程序的安全性。這樣的習慣是極好的。但是無形中也增加了一定的代碼量。有時候這樣的代碼還極有可能是無用的廢代碼。然而在Kotlin中當我們可以確定這個屬性或變量一定不為空時,我們就用上面講解到的去定義變量。否則就把它聲明為可空變量。 可空變量的特點: * 在聲明的時候**一定用標準的聲明格式定義**。不能用可推斷類型的簡寫。 * **變量類型后面的?符號不能省略**。不然就和普通的變量沒區別了。 * **其初始化的值可以為null或確定的變量值**。 **定義格式:var/val 變量名 : 類型? = null/確定的值** 代碼示例,同上,類中聲明變量中的class Test2中的代碼 ### 三、后期初始化與延遲初始化 在上面小節中,當在類中定義一個變量(屬性)的時候是必須初始化的。這在平時的實際開發中能滿足大部分的需求。 但是還是有一些特殊的場景中不能滿足。比如說:Android開發中對組件變量的聲明與賦值,以及在使用Dagger2注解變量等。 這就需要Kotlin中特有的后期初始化屬性來滿足這個需求了。當然這里還為大家講解延遲初始化,在實際的開發中也是很有用處的。 #### 3.1 后期初始化屬性 聲明后期初始化屬性的特點: * **使用lateinit關鍵字** * 必須是可讀且可寫的變量,即**必須用var聲明的變量** * **不能聲明于可空變量**。 * **不能聲明于基本數據類型變量**。例:Int、Float、String等 * **聲明后,在使用該變量前必須賦值**,不然會拋出UninitializedPropertyAccessException異常。 實例講解:舉一個Android中常見的例子 ~~~ // 聲明組件 private lateinit var mTabLayout : TabLayout lateinit var a : Int // 會報錯。因為不能用于基本數據類型。 // 賦值 mTabLayout = find(R.id.home_tab_layout) // 使用 mTabLayout.setupWithViewPager(mViewPager) ~~~ #### 3.2 延遲初始化屬性 所謂延遲初始化即:指當程序在第一次使用到這個變量(屬性)的時候再初始化。 聲明延遲初始化屬性的特點: * 使用`lazy{}`高階函數,不能用于類型推斷。且該函數在變量的數據類型后面,用by鏈接。 * 必須是只讀變量,即**必須用val聲明的變量**。 實例講解:同樣是Android中常見的例子 ~~~ // 聲明一個延遲初始化的字符串數組變量 private val mTitles : Array<String> by lazy { arrayOf( ctx.getString(R.string.tab_title_android), ctx.getString(R.string.tab_title_ios), ctx.getString(R.string.tab_title_h5) ) } // 聲明一個延遲初始化的字符串 private val mStr : String by lazy{ "我是延遲初始化字符串變量" } ~~~ ### Kotlin之常量的用法 Kotlin中聲明常量的方式和在Java中聲明常量的方式有很大的區別。這里舉例說明: Kotlin中使用val時候對應的Java代碼: ~~~ Kotlin中的 val numA = 6 等價于 Java中的:public final int numA = 6 ~~~ 很顯然,Kotlin中只用val修飾還不是常量,它**只能是一個不能修改的變量**。那么常量怎么定義呢?其實很簡單,**還需在val關鍵字前面加上const關鍵字**。 即: ~~~ const val NUM_A = 6 ~~~ 其特點:**const只能修飾val,不能修飾var** **聲明常量的以下幾種正確方式** 1. 在頂層聲明 2. 在object修飾的類中聲明,在kotlin中稱為對象聲明,它相當于Java中一種形式的單例類 3. 在伴生對象中聲明 此外還需滿足以下條件: * 以`String`或原生類型值初始化(初始化為`String`類型或基本類型的值) * 沒有自定義getter 舉例說明: ~~~ /** *常量的使用 */ // 1. 頂層聲明 const val NUM_A: String = "頂層聲明" // 2. 在object修飾的類中 object TestConst { const val NUM_B = "object修飾的類中" } // 3. 伴生對象中 class TestClass { companion object { const val NUM_C = "伴生對象中聲明" } } fun main(args: Array<String>) { println("NUM_A => $NUM_A") println("NUM_B => ${TestConst.NUM_B}") println("NUM_C => ${TestClass.NUM_C}") } ~~~ 輸出結果 ~~~ NUM_A => 頂層聲明 NUM_B => object修飾的類中 NUM_C => 伴生對象中聲明 ~~~ ### 伴生對象 **類內部的對象聲明可以? companion 關鍵字標記**: ~~~ class MyClass { companion object Factory { fun create(): MyClass = MyClass() } } ~~~ **該伴?對象的成員可通過只使?類名作為限定符來調?**: ~~~ val instance = MyClass.create() ~~~ 可以省略伴?對象的名稱,在這種情況下將使?名稱 Companion : ~~~ class MyClass { companion object { } } val x = MyClass.Companion ~~~ 請注意,即使伴?對象的成員看起來像其他語?的靜態成員,在**運?時他們仍然是真實對象的實例成員**,?且,例如還可以實現接?: ~~~ interface Factory<T> { fun create(): T } class MyClass { companion object : Factory<MyClass> { override fun create(): MyClass = MyClass() } } ~~~ 當然,在 JVM 平臺,如果使? @JvmStatic 注解,你可以將伴?對象的成員?成為真正的靜態?法和字段。
                  <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>

                              哎呀哎呀视频在线观看