Kotlin學習總結(二)寫個變量

2019.07.02基本類型部分:沒有人能夠幫你努力,你只有靠本身

寫個變量

Kotlin中var和val的區別:
Kotlin中有兩個關鍵字定義變量,這兩個關鍵字外形看着差異很小就只差了一個字母,但實際差異很大的。
var是一個可變變量,這是一個能夠經過從新分配來更改成另外一個值的變量。這種聲明變量的方式和java中聲明變量的方式同樣。
val是一個只讀變量,這種聲明變量的方式至關於java中的final變量。一個val建立的時候必須初始化,由於之後不能被改變。

基本類型

在 Kotlin 中,全部東西都是對象,在這個意義上講咱們能夠在任何變量上調用成員函數與屬性。 一些類型能夠有特殊的內部表示——例如,數字、字符以及布爾值能夠在運行時表示爲原生類型值,可是對於用戶來講,它們看起來就像普通的類。 在本節中,咱們會描述 Kotlin 中使用的基本類型:數字、字符、布爾值、數組與字符串。
數字
Kotlin 處理數字在某種程度上接近 Java,可是並不徹底相同。例如,對於數字沒有隱式拓寬轉換(如 Java 中 int 能夠隱式轉換爲long——譯者注),另外有些狀況的字面值略有不一樣。
Kotlin 提供了以下的內置類型來表示數字(與 Java 很相近):
Kotlin 的基本數值類型包括 Byte、Short、Int、Long、Float、Double 等。不一樣於 Java 的是,字符不屬於數值類型,是一個獨立的數據類型。
Type
Bit width
Double
64
Float
32
Long
64
Int
32
Short
16
Byte
8
注意在 Kotlin 中字符不是數字

字面常量

數值常量字面值有如下幾種:
  • 十進制: 123
  • Long 類型用大寫 L 標記: 123L
  • 十六進制: 0x0F
  • 二進制: 0b00001011
注意: 不支持八進制
Kotlin 一樣支持浮點數的常規表示方法:
  • 默認 double:123.五、123.5e10
  • Float 用 f 或者 F 標記: 123.5f

fun basicNumberTest(){
    //Int類型
    var testInt:Int=1
    //Long類型(與Int類型的區分看L)
    var testLong:Long=123L
    //Short類型,表示整型,數值範圍比較小(-32768~32767),所佔字節小
    var testShort:Short= Short.MAX_VALUE
    //Double類型
    var testDouble:Double=12.21
    //Float類型(與Double類型的區分看f或者F)
    var testFloat:Float=12.12F
    //Byte類型,表示整型,數值範圍( -128~127)
    var testByte:Byte= Byte.MAX_VALUE
}複製代碼
數字字面值中的下劃線,使用下劃線使數字常量更易讀

val lastTime:Int=1_000_000複製代碼
在 Java 平臺數字是物理存儲爲 JVM 的原生類型,除非咱們須要一個可空的引用(如 Int?)或泛型。 後者狀況下會把數字裝箱。注意數字裝箱不必定保留同一性,另外一方面,它保留了相等性

fun basicNumberTest(){
    val lastTime:Int=1_000_000
    println("-----------------------")
    println(lastTime==lastTime)//輸出true
    println("-----------------------")
    val fristTime:Int?=lastTime
    println(fristTime==lastTime)//輸出true
    println(fristTime===lastTime)//輸出false
    println("-----------------------")
    val scondTime:Int?=lastTime
    println(fristTime==scondTime)//輸出true
    println(fristTime===scondTime)//輸出false
    println("-----------------------")
   val thirdTime:Int=lastTime
   println(lastTime==thirdTime)//輸出true
   println(lastTime===thirdTime)//輸出true
}複製代碼

顯式轉換

因爲不一樣的表示方式,較小類型並非較大類型的子類型。 若是它們是的話,就會出現下述問題:

// 假想的代碼,實際上並不能編譯,會提示錯誤
fun basicNumberTest(){
    val lastTime:Int?=1_000_000
    val fristTime:Long?=lastTime
    println(lastTime==fristTime)
}複製代碼
所以較小的類型不能隱式轉換爲較大的類型。 這意味着在不進行顯式轉換的狀況下咱們不能把 Byte 型值賦給一個 Int 變量。

val b: Byte = 1 // OK, 字面值是靜態檢測的
val i: Int = b // 錯誤複製代碼
顯式轉換來拓寬數字

val i: Int = b.toInt() // OK:顯式拓寬
print(i)複製代碼
缺少隱式類型轉換不多會引發注意,由於類型會從上下文推斷出來,而算術運算會有重載作適當轉換,例如:

val l = 1L + 3 // Long + Int => Long複製代碼

運算

Kotlin支持數字運算的標準集,運算被定義爲相應的類成員(但編譯器會將函數調用優化爲相應的指令)。對於位運算,沒有特殊字符來表示,而只可用中綴方式調用命名函數,例如:
val x = (1 shl 2) and 0x000FF000

這是完整的位運算列表(只用於 Int 與 Long):
  • shl(bits) – 有符號左移 (Java 的 <<)
  • shr(bits) – 有符號右移 (Java 的 >>)
  • ushr(bits) – 無符號右移 (Java 的 >>>)
  • and(bits) – 位與
  • or(bits) – 位或
  • xor(bits) – 位異或
  • inv() – 位非
位運算這部分涉及的知識還不少,下次寫個專題,今天先跳過這裏。
浮點數比較
浮點數操做以下:
  • 相等性檢測:a == b 與 a != b
  • 比較操做符:a < b、 a > b、 a <= b、 a >= b
  • 區間實例以及區間檢測:a..b、 x in a..b、 x !in a..b
當其中的操做數 a 與 b 都是靜態已知的 Float 或 Double 或者它們對應的可空類型(聲明爲該類型,或者推斷爲該類型,或者智能類型轉換的結果是該類型),兩數字所造成的操做或者區間遵循 IEEE 754 浮點運算標準。
然而,爲了支持泛型場景並提供全序支持,當這些操做數並不是靜態類型爲浮點數(例如是 Any、 Comparable<……>、 類型參數)時,這些操做使用爲 Float 與 Double 實現的不符合標準的 equals 與 compareTo,這會出現:
  • 認爲 NaN 與其自身相等
  • 認爲 NaN 比包括正無窮大(POSITIVE_INFINITY)在內的任何其餘元素都大
  • 認爲 -0.0 小於 0.0

PS:NaN,「not a number」一個不是數的數複製代碼

fun basicFloatTest(){
    var num1:Float=10f
    if (num1 in 11..14){
        println("在11-14之間")
    }else{
        println("不在11-14之間")
    }
}複製代碼

字符Char 類型

字符用 Char 類型表示。它們不能直接看成數字
字符字面值用單引號括起來: '1'。 特殊字符能夠用反斜槓轉義。 支持這幾個轉義序列:\t、 \b、\n、\r、\'、\"、\\ 與 \$。 編碼其餘字符要用 Unicode 轉義序列語法:'\uFF00'。
咱們能夠顯式把字符轉換爲 Int 數字,當須要可空引用時,像數字、字符會被裝箱。裝箱操做不會保留同一性。

fun basicTest(){
    var charStr:Char='a'
    println("charStr--${charStr.toInt()}")
}複製代碼
結果:
charStr--97

布爾Boolean 類型

布爾用 Boolean 類型表示,它有兩個值:true 與 false。
若須要可空引用布爾會被裝箱。
內置的布爾運算有:
  • || – 短路邏輯或
  • && – 短路邏輯與
  • ! - 邏輯非

fun basicTest(){
    var isShow=true
    if(isShow){
        println("show")
    }else{
        println("noshow")
    }
}複製代碼

無符號整型

無符號類型自 Kotlin 1.3 起纔可用,而且目前是實驗性的
Kotlin 爲無符號整數引入瞭如下類型:
  • kotlin.UByte: 無符號 8 比特整數,範圍是 0 到 255
  • kotlin.UShort: 無符號 16 比特整數,範圍是 0 到 65535
  • kotlin.UInt: 無符號 32 比特整數,範圍是 0 到 2^32 - 1
  • kotlin.ULong: 無符號 64 比特整數,範圍是 0 到 2^64 - 1
與原生類型相同,每一個無符號類型都有相應的爲該類型特化的表示數組的類型:
  • kotlin.UByteArray: 無符號字節數組
  • kotlin.UShortArray: 無符號短整型數組
  • kotlin.UIntArray: 無符號整型數組
  • kotlin.ULongArray: 無符號長整型數組
無符號這裏不作過多的討論了。須要的本身升級到1.3,而後實踐

字符串String 類型

字符串用 String 類型表示。字符串是不可變的。 字符串的元素——字符可使用索引運算符訪問: s[i]。 能夠用 for 循環迭代字符串。

fun basicTest(){
    var str="nihao"
    for (c in str) {
        println(c)
    }
}
------------start----------
n
i
h
a
o
------------stop----------複製代碼

用 + 操做符鏈接字符串。這也適用於鏈接字符串與其餘類型的值, 只要表達式中的第一個元素是字符串,和java差很少。請注意,在大多數狀況下,優先使用字符串模板或原始字符串而不是字符串鏈接。kotlin推薦的也是使用字符串模板。字符串模板,字符串字面值能夠包含模板表達式 ,即一些小段代碼,會求值並把結果合併到字符串中。 模板表達式以美圓符($)開頭,由一個簡單的名字構成:

fun basicTest(){
    var name="wu xian sheng"
    var age1=12
    var age2=15
    println("my name is $name,my age is${age1+age2}")
}複製代碼
Kotlin 有兩種類型的字符串字面值: 轉義字符串能夠有轉義字符,以及原始字符串能夠包含換行以及任意文本。轉義字符串很像 Java 字符串:

fun basicTest(){
    var name="my name is wu xian sheng\n"
    print(name)
    print("ohoh")
    print("haha")
}複製代碼
結果:

------------start----------
my name is wu xian sheng
ohohhaha------------stop----------複製代碼
原始字符串 使用三個引號(""")分界符括起來,內部沒有轉義而且能夠包含換行以及任何其餘字符:

fun basicTest(){
    var name="my name is wu xian sheng\n"
    var message="""my name is wu xian sheng\n"""
    print(name)
    print(message)
    print("haha")
}複製代碼
結果:

------------start----------
my name is wu xian sheng
my name is wu xian sheng\nhaha------------stop----------複製代碼
你能夠經過 trimMargin() 函數去除前導空格:

fun basicTest(){
    var name=" my name is wu xian sheng\n"
    var message=""" <my name is wu xian sheng\n"""
    print(name)
    print(message.trimMargin("<"))
    print("haha")
}複製代碼
結果

------------start----------
         my name is wu xian sheng
my name is wu xian sheng\nhaha------------stop----------複製代碼
默認 | 用做邊界前綴,但你能夠選擇其餘字符並做爲參數傳入,好比 trimMargin(">")。

數組

數組在 Kotlin 中使用 Array 類來表示,它定義了 get 與 set 函數(按照運算符重載約定這會轉變爲 [])以及 size 屬性,以及一些其餘有用的成員函數:

class Array<T> private constructor() {
    val size: Int
    operator fun get(index: Int): T
    operator fun set(index: Int, value: T): Unit

    operator fun iterator(): Iterator<T>
    // ……
}複製代碼

咱們可使用庫函數 arrayOf() 來建立一個數組並傳遞元素值給它,這樣 arrayOf(1, 2, 3) 建立了 array [1, 2, 3]。 或者,庫函數 arrayOfNulls() 能夠用於建立一個指定大小的、全部元素都爲空的數組。
另外一個選項是用接受數組大小以及一個函數參數的 Array 構造函數,用做參數的函數可以返回給定索引的每一個元素初始值。
Kotlin建立數組大體有以下兩種方式:
  • 1.使用arrayOf(), arrayOfNulls(),emptyArray()工具函數。
  • 2.使用Array(size: Int, init:(Int) -> T)

fun basicTest(){
    //1.使用arrayOf(), arrayOfNulls(),emptyArray()工具函數。
    //2.使用Array(size: Int, init:(Int) -> T)
    var array1=arrayOf("ddd",2,"3")
    var array2= arrayOfNulls<Int>(2)
    //emptyArray() 函數是建立一個長度爲 0 的 null 數組,而後將它強制轉換爲指定類型的數組。
    var array3= emptyArray<String>()
    var array4=Array(3,{"nihao"+it})
    array2.set(0,12)
    array2.set(1,24)
    array1.forEach {
        println(it)
    }
    array2.forEach {
        println(it)
    }
    array4.forEach {
        println(it)
    }
}複製代碼
結果

------------start----------
ddd
2
3
12
24
nihao0
nihao1
nihao2
------------stop----------複製代碼
除了類Array,還有ByteArray, ShortArray, IntArray,用來表示各個類型的數組,省去了裝箱操做,所以效率更高,其用法同Array同樣

fun basicTest(){
    val x: IntArray = intArrayOf(1, 2, 3)
    x[0] = x[1] + x[2]
    x.forEach { 
        println(it)
    }
}複製代碼
結果:

------------start----------
5
2
3
------------stop----------複製代碼
總結:
學習完這節,基本上變量的聲明和基本類型的建立已經會了。接下來就是函數了。
相關文章
相關標籤/搜索