在Kotlin
中的變數、常量以及註釋多多少少和Java
語言是有著不同之處的。不管是變數、常量的定義方式,還是註釋的使用。下面詳細的介紹Kotlin
中的變數、常量、註釋的使用。以及和Java
的對比。
如果您還沒有搭建環境和不瞭解Kotlin
的,請看我的上一篇博文Kotlin——初級篇(一):開發環境搭建
目錄
一、Kotlin之變數用法
kotlin
變數的宣告方式與Java
中宣告變數有很大的區別,而且必須使用var
或val
關鍵字。其中:
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
複製程式碼
- 其中。
var
和val
是Kotlin
中定義變數必須使用的關鍵字。- 每一行程式碼的結束可以省略掉分號
;
,這一點是和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——初級篇(六): 可空型別、空安全(null)、型別轉換等特性總結這篇文章。
1.3、後期初始化與延遲初始化
在1.2節中,當在類中定義一個變數(屬性)的時候是必須初始化的。這在平時的實際開發中能滿足大部分的需求。但是還是有一些特殊的場景中不能滿足。比如說:Android
開發中對元件變數的宣告與賦值,以及在使用Dagger2
註解變數等。這就需要Kotlin
中特有的後期初始化屬性來滿足這個需求了。當然這裡還為大家講解延遲初始化,在實際的開發中也是很有用處的。
1.3.1、後期初始化屬性
宣告後期初始化屬性的特點:
- 使用
lateinit
關鍵字- 必須是可讀且可寫的變數,即用
var
宣告的變數- 不能宣告於可空變數。
- 不能宣告於基本資料型別變數。例:
Int
、Float
、Double
等,注意: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
宣告常量的三種正確方式
- 在頂層宣告
- 在
object
修飾的類中宣告,在kotlin
中稱為物件宣告,它相當於Java
中一種形式的單例類- 在伴生物件中宣告
舉例說明:
// 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
Github:Jteictors