Kotlin——初級篇(二):變量、常量、注釋


Kotlin中的變量、常量以及注釋多多少少和Java語言是有着不同之處的。不管是變量、常量的定義方式,還是注釋的使用。下面詳細的介紹Kotlin中的變量、常量、注釋的使用。以及和Java的對比。
如果您還沒有搭建環境和不了解Kotlin的,請看我的上一篇博文Kotlin——初級篇(一):開發環境搭建

目錄

一、Kotlin之變量用法

kotlin變量的聲明方式與Java中聲明變量有很大的區別,而且必須使用varval關鍵字。其中:

  • var: 用此關鍵字聲明的變量表示可變變量,即可讀且可寫。相當於Java中普通變量
  • val: 用此關鍵字聲明的變量表示不可變變量,即可讀且不可寫。相當於Java中用final修飾的變量

1.1、基礎用法

  • 定義格式: 關鍵字 變量名: 數據類型 = xxx

例:這是在頂層聲明的時候

//立即初始化
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
  • 其中。varvalKotlin中定義變量必須使用的關鍵字。
  • 每一行代碼的結束可以省略掉分號;,這一點是和Java不同的地方。當然,第一次寫可能會有一點不習慣。
  • print()println()都是打印方法,后者打印完成之后會換一行。此兩個方法和Java的打印方法是一模一樣的。
  • $符號表示引用的意思。這里理解為字符串模板,在后續的數據類型章節下的字符串類型中會講解到。

1.2、在類中聲明以及聲明可空變量

1.2.1、類中聲明變量

上面的是演示變量的基礎定義。而且只有在頂層聲明的情況下是可以不用實例化的。但是在實際開發當中,一般都是在一個類中去定義變量,這種情況被稱為聲明類的屬性。在后面Kotlin——中級篇(二):屬性與字段詳解章節會詳細的講解。這里講解其聲明的特點並實例分析。

其特點如下:必須初始化,如果不初始化,需使用lateinit關鍵字。參見1.3節。

例:

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

輸出結果為:

var_a => 10 	 val_a => 0

其中:在上面的例子中,大家只要關心類中聲明變量的用法就可以了。其他的不用關心,這里只是為了能看到程序運行結果。

1.2.2、聲明可空變量

Java中,當我們聲明一個變量不必關心這個變量是否為空,在使用這個變量的時候幾乎上都會判斷其是否為空增加程序的安全性。這樣的習慣是極好的。但是無形中也增加了一定的代碼量。有時候這樣的代碼還極有可能是無用的廢代碼。然而在Kotlin中當我們可以確定這個屬性或變量一定不為空時,我們就用上面講解到的去定義變量。否則就把它聲明為可空變量

可空變量的特點:

  • 在聲明的時候一定用標准的聲明格式定義。不能用可推斷類型的簡寫。
  • 變量類型后面的?符號不能省略。不然就和普通的變量沒區別了。
  • 其初始化的值可以為null或確定的變量值。

定義:

var/val 變量名 : 類型? = null/確定的值

例:

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

關於可空變量的定義就上面那么多。但是在使用可空變量的時候就沒有Java中那么復雜了。關於可空變量的使用請參見我的Kotlin——初級篇(六): 可空類型、空安全、非空斷言、類型轉換等特性總結這篇文章。

1.3、后期初始化與延遲初始化

在1.2節中,當在類中定義一個變量(屬性)的時候是必須初始化的。這在平時的實際開發中能滿足大部分的需求。但是還是有一些特殊的場景中不能滿足。比如說:Android開發中對組件變量的聲明與賦值,以及在使用Dagger2注解變量等。這就需要Kotlin中特有的后期初始化屬性來滿足這個需求了。當然這里還為大家講解延遲初始化,在實際的開發中也是很有用處的。

1.3.1、后期初始化屬性

聲明后期初始化屬性的特點:

  • 使用lateinit關鍵字
  • 必須是可讀且可寫的變量,即用var聲明的變量
  • 不能聲明於可空變量。
  • 不能聲明於基本數據類型變量。例:IntFloatDouble等,注意:String類型是可以的。
  • 聲明后,在使用該變量前必須賦值,不然會拋出UninitializedPropertyAccessException異常。

實例講解:舉一個Android中常見的例子

// 聲明組件
private lateinit var mTabLayout : TabLayout

lateinit var a : Int // 會報錯。因為不能用於基本數據類型。

// 賦值
mTabLayout = find(R.id.home_tab_layout)

// 使用
mTabLayout.setupWithViewPager(mViewPager)

1.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. 在伴生對象中聲明

舉例說明:

// 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 => 伴生對象中聲明

三、Kotlin之注釋

Kotlin中的注釋幾乎和Java沒什么區別。唯一的區別在於Kotlin中的多行注釋中可以嵌套多行注釋,而Java中是不能的。

  • 單行注釋

兩個斜杠開頭表示單行注釋(//

舉例:

// 1. 單行注釋
  • 多行注釋(塊注釋)

以斜杠加星號開頭(/*),同時以星號加斜杠結尾(*/),中間這是要注釋的代碼塊!

舉例:

 /*
    2. 多行注釋(塊注釋)
        我是多行注釋
 */
  • 多行注釋嵌套

kotlin中塊注釋的級聯使用,其實個人覺得塊注釋的嵌套使用的意義不大,不過從視覺上確實能給人一種層次感

舉例:

  /*
    第一層塊注釋
    /*
        第二層塊注釋
        /*
            第三層快注釋
            這種注釋方式在java中是不支持的,但是在kotlin中是支持的。算是一個亮點吧(貌似意義不大)。
         */
     */
 */

注:在Java中使用上面的注釋代碼直接報錯。

  • 類注釋、方法注釋

和Java是一樣的

舉例:

/**
 *  3. 方法的注釋(同java一樣)
 */
fun testMethodNote(){
    
}

四、尾語

對於Kotlin中的變量、常量及注釋就講解到這里。對於Kotlin的數據類型、控制語句等基礎語法會在后面的章節中更新。並提供源碼。
源代碼

如果各位大佬看了之后感覺還闊以,就請各位大佬隨便star一下,您的關注是我最大的動力。
我的個人博客Jetictors
掘金Jetictors
GithubJteictors

歡迎各位大佬進群共同研究、探索

QQ群號:497071402


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM