Kotlin學(xué)習(xí)系列(二)Kotlin語(yǔ)法基礎(chǔ)

本系列內(nèi)容均來(lái)自《Kotlin從小白到大?!芬粫?,感謝作者關(guān)東升老師。

標(biāo)識(shí)符和關(guān)鍵字

1標(biāo)識(shí)符

標(biāo)識(shí)符就是變量、 常量、 函數(shù)、 屬性、 類、 接口和擴(kuò)展等由程序員指定的名字。 構(gòu)成標(biāo)識(shí)符的字符均有一定的規(guī)范, Kotlin語(yǔ)言中標(biāo)識(shí)符的命名規(guī)則如下:

  1. 區(qū)分大小寫: Myname與myname是兩個(gè)不同的標(biāo)識(shí)符。
  2. 首字符, 可以是下劃線( _) 或字母, 但不能是數(shù)字。
  3. 除首字符外其他字符, 可以是下劃線( _) 、 字母和數(shù)字。
  4. 硬關(guān)鍵字( Hard Keywords) 不能作為標(biāo)識(shí)符, 軟關(guān)鍵字( Soft Keywords) 、
    修飾符關(guān)鍵字( Modifier Keywords) 在它們的適用場(chǎng)景之外可以作為標(biāo)識(shí)符使
    用。
  5. 特定標(biāo)識(shí)符field和it。 在Kotlin語(yǔ)言中有兩個(gè)由編譯器定義的特定標(biāo)識(shí)符, 它們
    只能在特定場(chǎng)景中使用有特定的作用, 而在其他的場(chǎng)景中可以做標(biāo)識(shí)符使用。

標(biāo)識(shí)符示例如下:

public fun main(args: Array<String>) {
    val `class` = "舞蹈學(xué)習(xí)班"http://class是硬關(guān)鍵字, 前后添加反引號(hào)( `) , 可以用于聲明標(biāo)識(shí)符
    val `π` = 3.14159 //Unicode編碼, 可以用于聲明標(biāo)識(shí)符
    var 您好 = "世界" //Unicode編碼, 可以用于聲明標(biāo)識(shí)符
    var public = "共有的" //public是修飾符關(guān)鍵字, 可以用于聲明變量標(biāo)識(shí)符
    println(`class`)
    println(π)
    val it = 100 //it是普通標(biāo)識(shí)符 ①
    val ary = arrayListOf<String>("A", "B", "C") //創(chuàng)建一個(gè)數(shù)組
    ary.forEach { println(it) } //it特定標(biāo)識(shí)符 ②
}

其中class是關(guān)鍵字, 事實(shí)上反引號(hào)` 不是標(biāo)識(shí)符的一部分, 它也可以用于其他標(biāo)識(shí)
符, 如π和π是等價(jià)的。 代碼第①行和第②行都使用it標(biāo)識(shí)符, 代碼第①行的it標(biāo)識(shí)符
是普通標(biāo)識(shí)符, 是由程序員定義的, 而代碼第②行的it標(biāo)識(shí)符是由編譯器定義的,
forEach { println(it) }中的{ println(it) }是一個(gè)Lambda表達(dá)式, it參數(shù)引
用數(shù)組中元素。

2關(guān)鍵字

關(guān)鍵字是類似于標(biāo)識(shí)符的保留字符序列, 由語(yǔ)言本身定義好的, Kotlin語(yǔ)言中有70多個(gè)
關(guān)鍵字, 全部是小寫英文字母, 以及!和?等字符構(gòu)成。 分為3個(gè)大類:

  1. 硬關(guān)鍵字( Hard Keywords) , 硬關(guān)鍵字任何情況下都不能作為標(biāo)識(shí)符, 具體包括如下關(guān)鍵字。
    as、 as?、 break、 class、 continue、 do、 else、 false、 for、 fun、 if、
    in、 !in、 interface、 is、 !is、 null、 object、 package、 return、
    super、 this、 throw、 true、 try、 typealias、 val、 var、 when和while。
  2. 軟關(guān)鍵字( Soft Keywords) , 軟關(guān)鍵字是在它適用場(chǎng)景中不能作為標(biāo)識(shí)符, 而其他場(chǎng)景中可以作為標(biāo)識(shí)符, 具體包括如下關(guān)鍵字。
    by、 catch、 constructor、 delegate、 dynamic、 field、 file、
    finally、 get、 import、 init、 param、 property、 receiver、 set、
    setparam和where。
  3. 修飾符關(guān)鍵字( Modifier Keywords) , 修飾符關(guān)鍵字是一種特殊的軟關(guān)鍵字,它們用來(lái)修飾函數(shù)、 類、 接口、 參數(shù)和屬性等內(nèi)容, 在此場(chǎng)景中不能作為標(biāo)識(shí)符。 而其他場(chǎng)景中可以作為標(biāo)識(shí)符, 具體包括如下關(guān)鍵字。
    abstract、 annotation、 companion、 const、 crossinline、 data、
    enum、 external、 final、 infix、 inner、 internal、 lateinit、
    noinline、 open、 operator、 out、 override、 private、 protected、
    public、 reified、 sealed、 suspend、 tailrec和vararg。

常量和變量

1 變量

在Kotlin中聲明變量, 就是在標(biāo)識(shí)符的前面加上關(guān)鍵字var, 示例代碼如下:

var _Hello = "HelloWorld" //聲明頂層變量 ①
public fun main(args: Array<String>) {
    _Hello = "Hello, World"
    var scoreForStudent: Float = 0.0f ②
    var y = 20 ③
    y = true //編譯錯(cuò)誤 ④
}

代碼第①行、 第②行和第③行分別聲明了三個(gè)變量。 第①行是頂層變量。 代碼第②行在聲明變量的同時(shí)指定數(shù)據(jù)類型是Float。 代碼第③行聲明變量時(shí), 沒(méi)有指定數(shù)據(jù)類型,
Kotlin編譯器會(huì)根據(jù)上下文環(huán)境自動(dòng)推導(dǎo)出來(lái)變量的數(shù)據(jù)類型, 例如變量y由于被賦值為
20, 20默認(rèn)是Int類型, 所以y變量被推導(dǎo)為Int類型, 所以試圖給y賦值true( 布爾值)時(shí), 會(huì)發(fā)編譯錯(cuò)誤。

2 常量和只讀變量

常量和只讀變量一旦初始化后就不能再被修改。 在Kotlin聲明常量是在標(biāo)識(shí)符的前面加上val或const val關(guān)鍵字, 它們的區(qū)別如下。

  • val聲明的是運(yùn)行期常量, 常量是在運(yùn)行時(shí)初始化的。
  • const val聲明的是編譯期常量, 常量是在編譯時(shí)初始化, 只能用于頂層常量聲明或聲明對(duì)象中的常量聲明, 而且只能是String或基本數(shù)據(jù)類型( 整數(shù)、 浮點(diǎn)等)
    注:編譯期常量( const val) 相當(dāng)于Java中public final static所修飾的常量。 而運(yùn)行期常量( val) 相當(dāng)于Java中final所修飾的常量。

示例代碼如下:

const val MAX_COUNT = 1000 //聲明頂層常量 ①
const val _Hello1 = "Hello, world" //聲明頂層常量 ②
const val _Hello2 = StringBuilder("HelloWorld")//編譯錯(cuò)誤 ③

//聲明對(duì)象
object UserDAO {
    const val MAX_COUNT = 100 //聲明對(duì)象中的聲明常量 ④
}

public fun main(args: Array<String>) {
    _Hello1 = "Hello, World" //編譯錯(cuò)誤 ⑤
    val scoreForStudent: Float = 0.0f ⑥
    val y = 20 ⑦
    y = 30 //編譯錯(cuò)誤 ⑧
    const val x = 10 //編譯錯(cuò)誤 ⑨
}

代碼第①行和第②行分別聲明了兩個(gè)頂層常量, 它們都是運(yùn)行期常量。
代碼第③行業(yè)試圖聲明StringBuilder類型的運(yùn)行期頂層常量, 但是這里會(huì)發(fā)生編譯錯(cuò)誤, 因?yàn)檫\(yùn)行期頂層常量只能是String或基本數(shù)據(jù)類型。
代碼第④行是在對(duì)象中聲明常量, objectUserDAO{}是對(duì)象聲明。
代碼第⑨行試圖在函數(shù)中運(yùn)行期常量, 會(huì)發(fā)生編譯錯(cuò)誤, 因?yàn)檫\(yùn)行期常量用于頂層常量或?qū)ο笾谐A柯暶鳌?br> 代碼第⑤行和第⑧行會(huì)發(fā)生編譯錯(cuò)誤, 因?yàn)檫@里試圖修改_Hello1常量值。
代碼第⑥行和第⑦行是聲明運(yùn)行時(shí)常量。 當(dāng)然, 運(yùn)行期常量也可以聲明為頂層的。約定 常量其實(shí)就是只讀變量, 編譯期常量( const val) 是更為徹底的常量, 一旦編譯之后就不能再修改了。 而運(yùn)行期常量( val) 還可以根據(jù)程序的運(yùn)行情況初始化。 為了描述方便,將運(yùn)行期常量稱為“只讀變量”。 默認(rèn)所說(shuō)的常量是編譯期常量。

3 使用var還是val?

在開(kāi)發(fā)過(guò)程中, 有的時(shí)選擇var還是val都能滿足需求, 那么選擇哪一個(gè)更好呢?
原則 如果兩種方式都能滿足需求情況下, 原則上優(yōu)先考慮使用val聲明。
因?yàn)橐环矫鎣al聲明的變量是只讀, 一旦初始化后不能修改, 這可以避免程序運(yùn)行過(guò)程中錯(cuò)誤地修改變量?jī)?nèi)容; 另一方面在聲明引用類型使用val, 對(duì)象的引用不會(huì)被修改, 但是引用內(nèi)容可以修改, 這樣會(huì)更加安全, 也符合函數(shù)式編程的技術(shù)要求。

語(yǔ)句與表達(dá)式

Kotlin代碼是由關(guān)鍵字、 標(biāo)識(shí)符、 語(yǔ)句和表達(dá)式等內(nèi)容構(gòu)成, 語(yǔ)句和表達(dá)式是代碼的重要組成部分。

1 語(yǔ)句

語(yǔ)句關(guān)注的代碼執(zhí)行過(guò)程, 如for、 while和do-while等。 在Kotlin語(yǔ)言中, 一條語(yǔ)句結(jié)束后可以不加分號(hào), 也可以加分號(hào), 但是有一種情況必須加分號(hào), 那就是多條語(yǔ)句寫在一行的時(shí)候, 需要通過(guò)分號(hào)來(lái)區(qū)別語(yǔ)句:

 var a1: Int = 10; var a2: Int = 20;
2 表達(dá)式

表達(dá)式是一般位于賦值符( =) 的右邊, 并且會(huì)返回明確的結(jié)果。 下列代碼中10和20是最簡(jiǎn)單形式的表達(dá)式。

var a1 = 10
val a2 = 20

在上述代碼中, 直接將表達(dá)式( 10和20) 賦值給變量或常量, 并沒(méi)有指定數(shù)據(jù)類型, 這因?yàn)樵贙otlin編譯器可以根據(jù)上下文自動(dòng)推斷數(shù)據(jù)類型。 上述代碼也可以指定數(shù)據(jù)類型。

var a1: Int = 10
val a2: Int = 20
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容