在Kotlin
中的變量、常量以及註釋多多少少和Java
語言是有着不一樣之處的。不論是變量、常量的定義方式,仍是註釋的使用。下面詳細的介紹Kotlin
中的變量、常量、註釋的使用。以及和Java
的對比。 若是您尚未搭建環境和不瞭解Kotlin
的,請看個人上一篇博文Kotlin——初級篇(一):開發環境搭建html
kotlin
變量的聲明方式與Java
中聲明變量有很大的區別,並且必須使用var
或val
關鍵字。其中:java
var
: 用此關鍵字聲明的變量表示可變變量,便可讀且可寫。至關於Java
中普通變量val
: 用此關鍵字聲明的變量表示不可變變量,便可讀且不可寫。至關於Java
中用final
修飾的變量
例:這是在頂層聲明的時候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
複製代碼
- 其中。
var
和val
是Kotlin
中定義變量必須使用的關鍵字。- 每一行代碼的結束能夠省略掉分號
;
,這一點是和Java
不一樣的地方。固然,第一次寫可能會有一點不習慣。print()
與println()
都是打印方法,後者打印完成以後會換一行。此兩個方法和Java
的打印方法是如出一轍的。$
符號表示引用的意思。這裏理解爲字符串模板,在後續的數據類型章節下的字符串類型中會講解到。
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——初級篇(六): 可空類型、空安全(null)、類型轉換等特性總結這篇文章。
在1.2節中,當在類中定義一個變量(屬性)的時候是必須初始化的。這在平時的實際開發中能知足大部分的需求。可是仍是有一些特殊的場景中不能知足。好比說:Android
開發中對組件變量的聲明與賦值,以及在使用Dagger2
註解變量等。這就須要Kotlin
中特有的後期初始化屬性來知足這個需求了。固然這裏還爲你們講解延遲初始化,在實際的開發中也是頗有用處的。
1.3.一、後期初始化屬性
聲明後期初始化屬性的特色:
- 使用
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.二、延遲初始化屬性
所謂延遲初始化即:指當程序在第一次使用到這個變量(屬性)的時候在初始化。
聲明延遲初始化屬性的特色:
- 使用
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
中聲明常量的方式和在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
中的註釋幾乎和Java
沒什麼區別。惟一的區別在於Kotlin
中的多行註釋中能夠嵌套多行註釋,而Java
中是不能的。
兩個斜槓開頭表示單行註釋(
//
)
舉例:
// 1. 單行註釋
複製代碼
以斜槓加星號開頭(
/*
),同時以星號加斜槓結尾(*/
),中間這是要註釋的代碼塊!
舉例:
/*
2. 多行註釋(塊註釋)
我是多行註釋
*/
複製代碼
kotlin中塊註釋的級聯使用,其實我的以爲塊註釋的嵌套使用的意義不大,不過從視覺上確實能給人一種層次感
舉例:
/*
第一層塊註釋
/*
第二層塊註釋
/*
第三層快註釋
這種註釋方式在java中是不支持的,可是在kotlin中是支持的。算是一個亮點吧(貌似意義不大)。
*/
*/
*/
複製代碼
注:在Java中使用上面的註釋代碼直接報錯。
和Java是同樣的
舉例:
/**
* 3. 方法的註釋(同java同樣)
*/
fun testMethodNote(){
}
複製代碼
對於Kotlin
中的變量、常量及註釋就講解到這裏。對於Kotlin
的數據類型、控制語句等基礎語法會在後面的章節中更新。並提供源碼。
源代碼
若是各位大佬看了以後感受還闊以,就請各位大佬隨便star
一下,您的關注是我最大的動力。
個人我的博客:Jetictors
Github:Jteictors