Kotlin實戰(一)
Kotlin實戰(一)
1、簡介
Kotlin 是一個用於現代多平臺應用的靜態程式語言,由 JetBrains 開發。
Kotlin可以編譯成Java位元組碼,也可以編譯成JavaScript,方便在沒有JVM的裝置上執行。
Kotlin已正式成為Android官方支援開發語言(Google IO 2017宣佈)。
分享關於kotlin的幾個網站
-
kotlin官方網站:https://kotlinlang.org/
-
kotlin官方網站(中文翻譯版):https://www.kotlincn.net/
-
kotlin線上工具網站(可執行kotlin程式碼):
2、基本使用
2.1、第一個Kotlin程式(定義函式)
使用控制檯打印出“Hello,Kotlin!”
fun main(args: Array<String>): Unit {
//列印Hello,Kotlin!
println("Hello,Kotlin!")
}
fun 固定寫法
main 函式名(main函式)
args 函式引數名,可以隨便寫(如a,bb)
Array 引數型別 此處表示字串陣列型別
Unit 函式返回值 ,此處Unit表示無返回值,可以省略不寫
println(“Hello,Kotlin!”)
2.2、基本資料型別
Kotlin 提供瞭如下的內建型別來表示數字(與 Java 很相近):
型別(Type) | 位寬度(Bit width) |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
//基本資料型別定義如下
val byte:Byte=10
val int:Int=100
val long:Long=1L
val double:Double=1.123
val float:Float=1.21212F
val short:Short=10
//布林(Boolean)型別 它有兩個值:true 與 false
val boolean:Boolean=false
//字元(Char)型別 它有兩個值:true 與 false
val char:Char='A'
2.3、字面常量
數值常量字面值有以下幾種:
-
十進位制: 123
Long 型別用大寫 L 標記: 123L -
十六進位制: 0x0F
-
二進位制: 0b00001011
注意: 不支援八進位制
Kotlin 同樣支援浮點數的常規表示方法:
預設 double:123.5、123.5e10
Float 用 f 或者 F 標記: 123.5f
2.4、數字字面值中的下劃線(自1.1版本起)
可以使用下劃線使數字常量更易讀
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
println(oneMillion)//1000000
println(creditCardNumber)//1234567890123456
println(socialSecurityNumber)//999999999
println(hexBytes)//4293713502
println(bytes)//3530134674
2.5、" == " 和 " === "的區別
kotlin | java |
---|---|
== | equal |
=== | == |
val a: Int = 999
val b: Int? = a
val c: Int? = a
println(b == c) //true
println(b === c) //false
這個和java中執行結果是在意料之中, == 比較數值, 而===比較的是地址, 前者為true, 後者為false. 那麼看下面這段程式碼的執行情況:
val a: Int = 999
val b: Int = a
val c: Int = a
println(b == c) // true
println(b === c) // true
這段程式碼和第一段程式碼的區別就是Int和Int?的區別, 為什麼=== 的運算結果會不一樣呢? 再看下面這段程式碼
val a: Int? = 999
val b: Int? = a
val c: Int? = a
println(b == c) //true
println(b === c) //true
這段程式碼和第一段程式碼的區別就是第一行的Int?和Int的區別, 而執行出來的結果 === 也是true。
下面這個就是對上述現象的最好的解釋
注意一點: 在 java 平臺上,數值被 JVM 虛擬機器以位元組碼的方式物理儲存的,除非我們需要做可空標識(比如說 Int?) 或者涉及泛型,在後者中數值是裝箱的。也就是說如果我們使用的是val a : Int = 999, 這種方式, 其實a就是個數值, 不涉及裝箱的問題, 不是個物件, 而如果我們使用的是val a: Int? = 999, 這樣的話, a是一個Int型物件, 涉及到裝箱問題, 這樣就很好解釋為什麼第一段程式碼的===是false, 因為a是數值, 而b, c是裝箱後的物件, 而第二段程式碼a, b, c都是數值, 第三段程式碼a, b, c都是同一個物件
2.6、基本資料型別取值範圍
val maxShort=Short.MAX_VALUE
val minShort=Short.MIN_VALUE
//Short最小值-32768,最大值32767
println("Short最小值$minShort,最大值$maxShort")
val maxInt=Int.MAX_VALUE
val minInt=Int.MIN_VALUE
//Int最小值-2147483648,最大值2147483647
println("Int最小值$minInt,最大值$maxInt")
val maxByte=Byte.MAX_VALUE
val minByte=Byte.MIN_VALUE
//Byte最小值-128,最大值127
println("Byte最小值$minByte,最大值$maxByte")
val maxLong=Long.MAX_VALUE
val minLong=Long.MIN_VALUE
//Long最小值-2147483648,最大值2147483647
println("Long最小值$minInt,最大值$maxInt")
val maxFloat=Float.MAX_VALUE
val minFloat=Float.MIN_VALUE
//Float最小值-2147483648,最大值2147483647
println("Float最小值$minInt,最大值$maxInt")
val maxDouble=Double.MAX_VALUE
val minDouble=Double.MIN_VALUE
//Double最小值-2147483648,最大值2147483647
println("Double最小值$minInt,最大值$maxInt")
2.7、Kotlin呼叫Java
val m=212.3234343454546546
println(m)
//省略new關鍵字
val bigDecimal = BigDecimal("212.3234343454546546")
println(bigDecimal)
2.8、智慧型別推斷和型別轉換
/*----------------------kotlin智慧型別推斷------------------------*/
// 型別安全的語言:型別一但確定,不再改變了
// kotlin 自動推斷為Int型別
var a=10
var b:Byte=10
var c=10L//Long
var d=20F//Float
var e=1.234//Double
/*----------------------型別轉換------------------------*/
// String和int型別轉換
val a1="10"
println(a1.toInt())
//long型別和int型別轉換
val a2=100L
print(a2.toInt()
//int型別和long型別轉換
val a3=10
print(a3.toLong())
每個數值型別都支援下面的轉換:
- toByte(): Byte
- toShort(): Short
- toInt(): Int
- toLong(): Long
- toFloat(): Float
- toDouble(): Double
- toChar(): Char
2.9、可變變數和不可變變數
//可變變數
var a=10
a=11
//不可變變數
val b=1
var是一個可變變數,這是一個可以通過重新分配來更改為另一個值的變數。這種宣告變數的方式和Java中宣告變數的方式一樣。
val是一個只讀變數,這種宣告變數的方式相當於java中的final變數。一個val建立的時候必須初始化,因為以後不能被改變。
不可變物件也可以說是執行緒安全的,因為它們無法去改變,也不需要去定義訪問控制,因為所有執行緒訪問到的物件都是同一個。所以在Kotlin中,如果我們想使用不可變性,我們編碼時思考的方式需要有一些改變。一個重要的概念是:儘可能地使用val。除了個別情況(特別是在Android中,有很多類我們是不會去直接呼叫建構函式的),大多數時候是可以的。如果使用var一般都需要判空。