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

Kotlin中的變量、常量以及註釋多多少少和Java語言是有着不一樣之處的。不論是變量、常量的定義方式,仍是註釋的使用。下面詳細的介紹Kotlin中的變量、常量、註釋的使用。以及和Java的對比。
若是您尚未搭建環境和不瞭解Kotlin的,請看個人上一篇博文Kotlin——初級篇(一):開發環境搭建html

目錄

1、Kotlin之變量用法

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

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

1.一、基礎用法

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

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

//當即初始化
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")

打印結果爲:ios

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.二、在類中聲明以及聲明可空變量

1.2.一、類中聲明變量git

上面的是演示變量的基礎定義。並且只有在頂層聲明的狀況下是能夠不用實例化的。可是在實際開發當中,通常都是在一個類中去定義變量,這種狀況被稱爲聲明類的屬性。在後面Kotlin——中級篇(二):屬性與字段詳解章節會詳細的講解。這裏講解其聲明的特色並實例分析。github

其特色以下:必須初始化,若是不初始化,需使用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

其中:在上面的例子中,你們只要關心類中聲明變量的用法就能夠了。其餘的不用關心,這裏只是爲了能看到程序運行結果。post

1.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.三、後期初始化與延遲初始化

在1.2節中,當在類中定義一個變量(屬性)的時候是必須初始化的。這在平時的實際開發中能知足大部分的需求。可是仍是有一些特殊的場景中不能知足。好比說:Android開發中對組件變量的聲明與賦值,以及在使用Dagger2註解變量等。這就須要Kotlin中特有的後期初始化屬性來知足這個需求了。固然這裏還爲你們講解延遲初始化,在實際的開發中也是頗有用處的。

1.3.一、後期初始化屬性

聲明後期初始化屬性的特色:

  • 使用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.二、延遲初始化屬性

所謂延遲初始化即:指當程序在第一次使用到這個變量(屬性)的時候在初始化。

聲明延遲初始化屬性的特色:

  • 使用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{
    "我是延遲初始化字符串變量"
}

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

3、Kotlin之註釋

Kotlin中的註釋幾乎和Java沒什麼區別。惟一的區別在於Kotlin中的多行註釋中能夠嵌套多行註釋,而Java中是不能的。

  • 單行註釋

    兩個斜槓開頭表示單行註釋(//

舉例:

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

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

舉例:

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

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

舉例:

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

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

  • 類註釋、方法註釋

    和Java是同樣的

舉例:

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

4、尾語

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

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

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

QQ羣號:497071402

相關文章
相關標籤/搜索