var 和 val (Declaring Properties)
val and var are the two keywords you can use to declare variables (and properties). The difference is that using val gives you a read-only variable, which is the same as using the final keyword in Java.
val 和 var 都是聲明變量的關(guān)鍵字。不同點在于val 是只讀變量,相當于java中的final變量,因此創(chuàng)建的時候必須初始化。
var x = 10 // int x = 10;
val y = 25 // final int y = 25;
Objects
1、Object expression(對象表達式)
在Android里面,我們對一些點擊事件的監(jiān)聽的時候,會使用到匿名內(nèi)部類
而在Kotlin中,就用對象表達式來替換匿名內(nèi)部類,是這樣子來寫的
fab.setOnClickListener(
object : View.OnClickListener {
override fun onClick(v: View?) {
}
})
// 上面可以使用Lambdas簡寫成
// fab.setOnClickListener( View.OnClickListener { })
如果父類有構(gòu)造函數(shù),則必須傳遞相應(yīng)的構(gòu)造函數(shù)。多個父類可以用逗號隔開,寫在冒號后面
open class A(x: Int) {
public open val y: Int = x
}
interface B {...}
val ab: A = object : A(1), B {
override val y = 15
}
當只需要一個對象just an object,沒有父類的情況下
val adHoc = object {
var x: Int = 0
var y: Int = 0
}
print(adHoc.x + adHoc.y)
就像Java的匿名內(nèi)部類一樣,對象表達式中的代碼可以訪問封閉范圍的變量。
fun countClicks(window: JComponent) {
var clickCount = 0 // 如果是Java的話這里要加上final
var enterCount = 0 // 這里也是
window.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) {
clickCount++
}
override fun mouseEntered(e: MouseEvent) {
enterCount++
}
})
// ...
}
與Java不同,封閉范圍的變量不需要聲明為final
2、Object declarations(對象聲明)
object DataProviderManager {
fun registerDataProvider(provider: DataProvider) {
// ...
}
val allDataProviders: Collection<DataProvider>
get() = // ...
}
這樣的代碼稱為一個 對象聲明(object declaration), 在 object 關(guān)鍵字之后必須指定對象名稱
注意: 對象聲明不可以是局部的(也就是說, 不可以直接嵌套在函數(shù)之內(nèi)), 但可以嵌套在另一個對象聲明之內(nèi), 或者嵌套在另一個非內(nèi)部類(non-inner class)之內(nèi).
3、Companion Objects(伴生對象)
Kotlin允許我們?nèi)ザx一些行為與靜態(tài)對象一樣的對象。盡管這些對象可以用眾所周知的模式來實現(xiàn),比如容易實現(xiàn)的單例模式。
我們需要一個類里面有一些靜態(tài)的屬性、常量或者函數(shù),我們可以使用companion objecvt。這個對象被這個類的所有對象所共享,就像Java中的靜態(tài)屬性或者方法。
Object expression是馬上執(zhí)行的
Object declaration是lazy的,在第一次使用時執(zhí)行
Companion Object是在類第一次加載時執(zhí)行
構(gòu)造方法
(待續(xù))