每一種語言都有自己的基本數據類型,Kotlin也有自己的數據類型,類似與Java包括整型 浮點型 布爾類型等。
今天的學習目錄
【變量】
(1)分隔符
Kotlin語言中的分號 花括號({ )} 方擴號( [ ] ) 原點( .)都具有分隔意義。
① 分號與Java語言不同Kotlin不強制要求每條語句必須以分號結尾,如果是一行內寫多個獨立語句,前面的語句需要用分號表示結束。
var nameC:String = "Hello"; var nameA:String = "Kotlin"
② 花括號的作用就是定義一個代碼塊,一個代碼塊指的就是“{”與“}”包含的一段代碼,代碼塊在邏輯上是一個整體。在Kotlin語言中,類體部分 枚舉 方法體,條件語句中的條件執行體,與循環語句的循環體也都放在代碼塊中。
(2) 標識符的規則
區分大小寫:Myname 與 myname 是兩個不同的標識符。
首字符:可以是下劃線 _ 或字母,但不能是數字。
除首字符外其他字符,可以是下劃線(_)、字母和數字。
硬關鍵字(Hard Keywords)不能作爲標識符,軟關鍵字(Soft Keywords)、修飾符關鍵字(Modifier Keywords)在它們的適用場景之外可以作爲標識符使用。
特定標識符 field 和 it。在 Kotlin 語言中有兩個由編譯器定義的特定標識符,它們只能在特定場景中使用有特定的作用,而在其他的場景中可以做標識符使用。
(3) 關鍵字
硬關鍵字(Hard Keywords),硬關鍵字在任何情況下都不能作爲關鍵字,具體包括如下關鍵字, 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。
軟關鍵字(Soft Keywords),軟關鍵字是在它適用場景中不能作爲標識符,而其他場景中可以作爲標識符,具體包括如下關鍵字, by、catch、constructor、delegate、dynamic、field、file、finally、get、import、init、param、property、receiver、set、setparam 和 where。
修飾符關鍵字(Modifier Keywords),修飾符關鍵字是一種特殊的軟關鍵字,它們用來修飾函數、類、接口、參數和屬性等內容,在此場景中不能作爲標識符。而其他場景中可以作爲標識符,具體包括如下關鍵字,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基本數據類型包括整型 長整型 浮點型 雙精度 布爾型 字符型 字符串 這幾種常見的數據類型,如下表
看起來是不是跟Java差不多,但是在聲明變量的時候卻與Java不同
Int i = 0 //java寫法
如果採用Java這種規則來書寫Kotlin代碼,Android Studio肯定在編譯的時候就不能通過,正確的Kotlin寫法
var i:Int = 0
Kotlin聲明語句是“變量名”:“變量類型”,而不是Java常見的“變量類型 變量名”這種格式,在這裏你會驚奇的發現Kotlin與Java正好相反,Kotlin聲明完畢無需分號,直接回車即可。(在分隔符中對分號有介紹,這裏就不詳細的介紹了)
(2)數值型之間的類型轉換
與Java一樣不同整型的變量能支持的表數範圍是不同的,比如Byte類型的變量或常量只能接受-128~127之間的整數, Short類型的變量或常量只能接受-32768 ~ 32767之間的整數,如果數值超出這個範圍就會編譯報錯。 簡單來說Kotlin不支持範圍小的數據類型隱式轉爲取值大的類型。在Kotlin中不允許通過Java的前綴表達式來強制轉換類型!
如下表
Kotlin要求不同變量或值之間必須進行顯式轉換,示例如下
val origin: Float = 65.0f
origin.toString()
var int: Int
int = origin.toInt()
int.toString()
LogUtil.printLog(LogUtil.E, "XX1", "原始值 " + origin + " 轉換值 " + int.toString())
var long: Long
long = origin.toLong()
LogUtil.printLog(LogUtil.E, "XX1", "原始值 " + origin + " 轉換值 " + long.toString())
var float: Float
float = origin.toDouble().toFloat()
LogUtil.printLog(LogUtil.E, "XX1", "原始值 " + origin + " 轉換值 " + float.toString())
var double: Double
double = origin.toDouble()
LogUtil.printLog(LogUtil.E, "XX1", "原始值 " + origin + " 轉換值 " + double.toString())
var char: Char
char = origin.toChar()
LogUtil.printLog(LogUtil.E, "XX1", "原始值 " + origin + " 轉換值 " + char.toString())
var boolean: Boolean
boolean = origin.isNaN()
LogUtil.printLog(LogUtil.E, "XX1", "原始值 " + origin + " 轉換值 " + boolean.toString())
截圖如下
【字符串】
(1)字符串與基本類型的轉換
字符串轉爲其他類型數據Kotlin與Java方式對比
(2)字符串的常用方法
Kotlin方法基本兼容Java相關的方法,比如查找指定位置的字串indexOf方法,截取某指定位置字串的方法substring,或者替換字串的操作所調用的replace,對於特定的字符分割操作split方法。
Kotlin使用indexOf 與substring查找截取字符串的例子
val origin: Float = 165.0f
origin.toString()
var text:String = origin.toString()
if (text.indexOf(".")>0){
text = text.substring(0,text.indexOf("."))
}
split方法的使用,在java中split返回的是Sting數組,但是在Kotlin中split返回的則是Sting類型的隊列,List< String >
var origin: String = "12345678.90"
var strList: List<String> = origin.split(".")
var strRe: String = ""
for (item in strList) {
strRe = strRe + item + ","
}
LogUtil.printLog(LogUtil.E, "XX0", strRe)
△
如果想獲取某個位置的字符,如果採用java的方式去實現時卻有些繁瑣,因爲只能調用substring方法去截取字符串的位置
Sting str = orgin.shubstring(number,number+1);
如果採用Kotlin去實現就方便很多,因爲它可以直接通過下標訪問字符串所指定的位置
Sting str = orgin[number].toString()
同時Kotlin也支持字符串變量通過Get的方式來獲取指定位置上的字符
Sting str = orgin.get(number).toString()
(3)字符串模板及其拼接
Kotlin允許字符串中嵌套變量或者表達式,我們只要把變量或者表達式放進${ }中就OK了,這樣Kotlin將該變量或表達式的值嵌入到該字符串中
var Price : Double= 88.0
var s = "圖書的價格是:${Price}元"
【數組–暫時先了解】
暫時先了解一下,在【集合】模塊中再詳細講解,先有個大概的瞭解也方便後續的學習
(1)數組變量的聲明
在Java中整數數組是這樣聲明並初始化的
int[] int_array = new int[]{1,2,3}
其他數據類型的數組聲明與之類似,我們只要把這個int 換成long float double 即可,但是在Kotlin中這麼玩是不可以的,Kotlin的數組聲明
var int_array:IntArray = intArrayof(1,2,3)
兩者相互對比 Kotlin中提供了新的整型數組類型—IntArray,在分配一個常量數組的時候Kotlin沒有使用關鍵字new,而是調用的intArrayOf方法
var intArray: IntArray = intArrayOf(1, 2, 3)
var longArray: LongArray = longArrayOf(1, 2, 3)
var floatArray: FloatArray = floatArrayOf(1.0f, 2.0f, 3.0f)
var doubleArray: DoubleArray = doubleArrayOf(1.0, 2.0, 3.0)
var charArray: CharArray = charArrayOf('a', 'b', 'c')
☆ Kotlin數組類型不包括字符數組,而大家所熟悉的Java是允許使用字符串數組的。
Sting[] sting_array = new Sting[]{"衝","鴨"}
在Kotlin中不存在StingArray的素組類型,因爲Sting是一種特殊的基本數據類型,想要在Kotlin中聲明字符串數組代碼如下
var string_array:Array<Sting> = arrayOf("衝","呀呀呀")
(2)數組元素的操作
獲取數組的長度,Java中.length ,而在Kotlin中所使用的則是.size
對於如何獲取指定位置的數組元素,Java通過方括號加下標來獲取,比如intarray[0] 獲取數組中的第一個元素。在Kotlin中也可以通過下標的方式獲取對應的元素,不過Kotlin要比Java多出兩個方法 get set,通過get獲取元素的值,通過set方法修改元素值,感覺就像在操作ArrayList隊列一樣
var string_array: Array<String> = arrayOf("How", "Are", "You")
var str: String = ""
var i: Int = 0
while (i < string_array.size) {
str = str + string_array[i] + ","
i++
}
LogUtil.printLog(LogUtil.E, "XXX", str)
【Null 安全】
null安全可以說是Kotlin對Java重大改進之一,這樣可以避免Java編程時候令人厭煩的NullPointErexception。
(1)非空類型與可空類型
var str:String = ""
var num :Int = str.toIntOrNull()
var num :Int? = str.toIntOrNull()
第二行代碼中的num類型爲Int,第三行代碼num類型爲Int? 。程序執行第二行代碼無法編譯,而第三行代碼能通過編譯。其中Int?就是一個可空類型,這種類型可以接受Int值和null;而Int類型只能接收Int值不能接受null。
☆ 只有可空的變量或常量才能接受null,非空類型的變量或常量不能接受null
var aStr: String = "kit"
var bStr: String? = "kitt"
aStr = null //錯誤 aStr 不接受null
bStr = null //正確
//編譯不能通過 不能產生NPE
LogUtil.printLog(LogUtil.E, "XX0", aStr.length)
LogUtil.printLog(LogUtil.E, "XX1", bStr.length)
放到IDE中直接標紅,沒辦法編譯,更不能產生NullPointErexception了
(2)先判斷後使用
可空類型的變量不允許直接調用方法或者屬性,但是可以先判斷該變量不爲null,然後再調用該變量的方法或者屬性。
var aStr: String? = "kit"
//先判斷aStr不爲null,然後再訪問aStr的屬性
var len = if (aStr != null) aStr.length else -1
//輸出aStr的長度
LogUtil.printLog(LogUtil.E, "XX0", "aStr的長度爲$len")
aStr = null
if (aStr != null && aStr.length > 0){
LogUtil.printLog(LogUtil.E, "XX0", "aStr的長度爲${aStr.length}")
}else{
LogUtil.printLog(LogUtil.E, "XX0", "字符串爲null")
}
(3)安全調用
Kotlin的安全調用如下
var b: String? = "kit"
print(b?.length) //輸出3
b = null
print(b?.length) //輸出null
即使是 b=null ,也不會引起NullPointErexception,而是返回null Kotlin安全調用也完全支持鏈式調用
user?.dog?.name
表示獲取user dog name 的屬性,如果user 或者user.dog 爲null 整個表達式返回爲null
(4)Elvis運算
Elvis運算也算是一種小技巧,其實也就是if else的簡化
//先判斷b不爲null,然後訪問 b的lenght屬性
if (b != null) b.length else -1
//使用Elvis運算
var len2 = b?.length?:-1
Elvis的含義如果“?:”左邊表達式不爲null返回左邊表達式的值,否則返回“?:” 右面表達式的值
小結
通過這次學習應該要掌握的技能
(1) 學會Kotlin對數據類型的變量定義以及變量之間的相互轉換
(2) 學會Kotlin對字符串的一些操作
(3) 瞭解Kotlin一些關鍵字,以及標識符的規則
(4) 瞭解各種類型數組的聲明方式以及數組變量常用的方法
(5) 對Kotlin Null 有一定的瞭解