基礎語法
1. 類的包名和類存放的路徑可以不匹配。
2. 行尾分號可選,但是如果多條語句在同一行,需要使用分號分隔
3. 沒有問號表達式(condition ? then : else),使用if-else表達式代替
fun max(a:Int, b:Int) = a>b?a:b ? //error
fun max(a:Int, b:Int) = if(a>b) a else b //OK
4. 引用類型不能初始化為null,但是可以在類型聲明后加?強制允許為null
var x:Int = null ?//error
var x:Int? = null ?//ok
5. 使用is關鍵字 代替 instanceof,as 關鍵字代替類型強制轉換(targetType)ref。is條件為true時,不需要在做類型轉換,可以直接當作目標類型使用。
fun getStrLength(x:Any):Int?{
if(x is String)
return x.length //不需要 (x as String).length
return null
}
6. in 關鍵字。
6.1 遍歷集合
for(i in 1..5) println(i)
6.2 判斷是否在集合中,類似contains。 前面加 ! 表示不在集合中。
println(2 in 1..5) //true
println(2 !in 1..5) //false
6.3 !非操作符,可以和in,is,=,==結合
!in 不在
!is 不是
!= 不等于 值不相等, 如果是引用類型,且沒有定義equals方法,那么結果為true
!== 引用不相等
7. 比較運算符:== 值比較,調用equals方法,如果類型沒有定義equals方法,始終為false;
=== 引用比較,比較是否指向同一個引用
data class User(val name:String, val id:Int)
val x = User("zt", 1)
val y = User("zt", 1)
println(x == y) // true,相當于x.equals(y)。 data class會自動生成equals方法
println(x === y) //false,比較引用是否相同
//無equals方法
class User(val name:String, val id:Int)
val x = User("zt", 1)
val y = User("zt", 1)
println(x == y) // false,沒有定義equals方法
println(x === y) //false,比較引用是否相同
8. when 可以做表達式,或語句;可以帶參數(shù),或不帶參數(shù)
9. data class 類自動生成的copy方法是淺拷貝(值拷貝)
data class Foot(var color:String)
data class Animal(val foot:Foot)
fun main(args: Array) {
val duck1 = Animal(Foot("yellow"))
val duck2 = duck1.copy()
val duck3 = Animal(Foot("yellow"))
println("duck1 == duck2 is ${duck1 == duck2}") //鴨子1和鴨子2看起來一樣
println("duck1 === duck2 is ${duck1 === duck2}") //鴨子1和鴨子2不是同一只
println("duck1' foot == duck2' foot ?is ${duck1.foot == duck2.foot}") //鴨子1和鴨子2腳的顏色看起來一樣
println("duck1' foot === duck2' foot ?is ${duck1.foot === duck2.foot}") //鴨子1和鴨子2公用一雙腳,連體腳。
println("duck1' foot == duck3' foot ?is ${duck1.foot == duck3.foot}") //鴨子1和鴨子3腳的顏色看起來一樣
println("duck1' foot === duck3' foot ?is ${duck1.foot === duck3.foot}") //鴨子1和鴨子3的腳不是同一雙,獨立的
duck2.foot.color ="blue" //把鴨子2的腳染成藍色,同時鴨子1的腳也會變成藍色,因為它們的腳是連體的。
println("duck1 = ${duck1}")
println("duck2 = ${duck2}")
println("duck3 = ${duck3}")
}
輸出:
duck1 == duck2 is true
duck1 === duck2 is false
duck1' foot == duck2' foot ?is true
duck1' foot === duck2' foot ?is true
duck1' foot == duck3' foot ?is true
duck1' foot === duck3' foot ?is false
duck1 = Animal(foot=Foot(color=blue))
duck2 = Animal(foot=Foot(color=blue))
duck3 = Animal(foot=Foot(color=yellow))