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 都是声明变量的关键字。不同点在于val 是只读变量,相当于java中的final变量,因此创建的时候必须初始化。
var x = 10 // int x = 10;
val y = 25 // final int y = 25;
Objects
1、Object expression(对象表达式)
在Android里面,我们对一些点击事件的监听的时候,会使用到匿名内部类
而在Kotlin中,就用对象表达式来替换匿名内部类,是这样子来写的
fab.setOnClickListener(
object : View.OnClickListener {
override fun onClick(v: View?) {
}
})
// 上面可以使用Lambdas简写成
// fab.setOnClickListener( View.OnClickListener { })
如果父类有构造函数,则必须传递相应的构造函数。多个父类可以用逗号隔开,写在冒号后面
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的匿名内部类一样,对象表达式中的代码可以访问封闭范围的变量。
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 关键字之后必须指定对象名称
注意: 对象声明不可以是局部的(也就是说, 不可以直接嵌套在函数之内), 但可以嵌套在另一个对象声明之内, 或者嵌套在另一个非内部类(non-inner class)之内.
3、Companion Objects(伴生对象)
Kotlin允许我们去定义一些行为与静态对象一样的对象。尽管这些对象可以用众所周知的模式来实现,比如容易实现的单例模式。
我们需要一个类里面有一些静态的属性、常量或者函数,我们可以使用companion objecvt。这个对象被这个类的所有对象所共享,就像Java中的静态属性或者方法。
Object expression是马上执行的
Object declaration是lazy的,在第一次使用时执行
Companion Object是在类第一次加载时执行
构造方法
(待续)
网友评论