1. 程式人生 > >Kotlin實戰(一)

Kotlin實戰(一)

Kotlin實戰(一)

1、簡介

Kotlin 是一個用於現代多平臺應用的靜態程式語言,由 JetBrains 開發。
Kotlin可以編譯成Java位元組碼,也可以編譯成JavaScript,方便在沒有JVM的裝置上執行。
Kotlin已正式成為Android官方支援開發語言(Google IO 2017宣佈)。

分享關於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

這段程式碼和第一段程式碼的區別就是IntInt?的區別, 為什麼=== 的運算結果會不一樣呢? 再看下面這段程式碼

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一般都需要判空。