在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——初級篇(六): 可空類型、空安全、非空斷言、類型轉換等特性總結這篇文章。
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
掘金 : Jetictors
Github:Jteictors