官方文檔java
官方中文閉包
val y: Int = 1 //不可變 var x: String ="" //可變
fun xxx( x: String, y: Int = 1): Boolean { return true } fun a( x: Int) : Int = 1+x //
contructor
, 函數體用 init
, 繼承關係用 :
代替java的 extendsclass ABC contructor(xxxx) : PARENT { init { } }
val a:String = null // error val a:TT? = null //有?,能夠 = null a.fff() //error a?.fff() //ok 等價於 if( a != null ) { a.fff(); }
class A { var x: String get() { return field } set() { field = value } }
{ }
塊的最後一行做爲返回值val x = if ( y <1 ) { 1 } else { 2 }
when( x ) { 1 -> { doSomething1() } 2 -> { doSomething2() } else -> { doSomething3() } // 和 default: 功能同樣 }
// A 是java類, 只有 a(), 沒有 b() 方法 // val x = A(); x.b() 是錯誤的 // // 定義擴展函數 fun A.b() { } // 而後 val x = A() x.b() // OK
${}
: {}
內部能夠填任何表達式val x = 5 val y = "y=${ x + 6 }" //字符串值爲 "y=11"
x ? y : z
表達式,只有 ?:
運算符a = b ?: c
等價於函數
if ( b != null) { a = b } else { a = c }
+
, -
, *
, /
等基本運算符的行爲詳情學習
class A { fun f1 () { } } a = A() x = a::f1 //將 A的方法 f1() 傳給 x x () // = 調用 a.f1()
java 的 Lamda 表達式.net
a = ( String a1, int a2 ) -> { return a1 + a2 } // a 能夠當函數調用 y = a ( "x" , 1) // y = "x1"
kotlin:線程
a = { a1: String, a2: Int -> a1 + a2 } // a 能夠當函數調用 y = a ( "x" , 1) // y = "x1"
括號的位置與java不一樣, 沒有 return 語句,最後一行就是返回值code
只有一個參數時,參數能夠不寫,默認爲 it
對象
fun f1() { fun fx( x: Int) { return 1+ x } return 5 + fx( 1 ) }
若有某java接口 IAblog
java繼承
newA = new Object() entends IA { //... }
kotlin
newA = object : IA { // ... }
class A { companion { fun y1() { } //每一個類只有一個companion對象 } } object B { val x1: Int = 1 } // 能夠這樣調用, 不須要調用構造函數 A.y1() x = B.x1
(參數1類型,參數2類型, ...)->返回值類型
fun f1( x: Int , y: String, z: Float = 10f ) { return y + x } // 打亂 x, y 的調用順序 f1( y = "hello", x = 5 )
()
外面如啓動線程作某事
thread( start = true, { doSomething() })
===>
thread( strat=true ) { doSomething() }