类成员
构造函数和初始化块 (第六章) 函数 (第五章) 属性 嵌套类和内部类 对象声明声明属性 :Kotlin的类可以有属性。 var 声明为可变的,val为只读的
声明一个属性的完整语法是
var <属性名称>[: <属性类型>] [= <初始值>] [] [ ] //例如 class Address { var name: String = …… var street: String = …… var city: String = …… var state: String? = …… var zip: String = …… }
其初始值、getter 和 setter 都是可选的。属性类型如果可以从初始器 (或者从其 getter 返回值,如下文所示)中推断出来,也可以省略。
var initialized = 1 // 类型 Int、默认 getter 和 setter
我们可以编写自定义的访问器,非常像普通函数,刚好在属性声明内部。
//这里有一个自定义 getter 的例子: val isEmpty: Boolean //可以理解为get()方法 = 语句(this.size == 0 结果是true或false再把结果赋值给get()方法) get() = this.size == 0 //一个自定义的 setter 的例子: var stringRepresentation: String get() = this.toString() set(value) { setDataFromString(value) // 解析字符串并赋值给其他属性 }
按照惯例,setter 参数的名称是 value,可以选择一个不同的名称。
自 Kotlin 1.1 起,如果可以从 getter 推断出属性类型,则可以省略属性类型:
// 从结果(this.size == 0)可以知道结果是boolean值 所以省略了属性的数据类型 isEmpty是属性的名称 val isEmpty get() = this.size == 0
如果你需要改变一个访问器的可见性或者对其注解,但是不需要改变默认的实现, 你可以定义访问器而不定义其实现:
var setterVisibility: String = "abc" private set // 此 setter 是私有的并且有默认实现 var setterWithAnnotation: Any? = null @Inject set // 可以用 Inject 注解此 setter
访问属性的方式 :名称.属性名称
//一个函数中的参数是Address类型的名称为address fun copyAddress(address: Address): Address { //创建一个Address类型的对象名为result的引用 //注意:Kotlin中没有“new”关键字 val result = Address() result.name = address.name // 将调用访问器 result.street = address.street // …… return result }
类可以嵌套在其他类中
class Outer { private val bar: Int = 1 class Nested { fun foo() = 2 } } val demo = Outer.Nested().foo() // == 2
类可以标记为 inner 以便能够访问外部类的成员。内部类会带有一个对外部类的对象的引用:
class Outer { private val bar: Int = 1 inner class Inner { fun foo() = bar } } val demo = Outer().Inner().foo() // == 1
使用对象表达式创建匿名内部类实例:
window.addMouseListener(object: MouseAdapter() { override fun mouseClicked(e: MouseEvent) { // …… } override fun mouseEntered(e: MouseEvent) { // …… } })
如果对象是函数式 Java 接口(即具有单个抽象方法的 Java 接口)的实例, 你可以使用带接口类型前缀的lambda表达式创建它:
val listener = ActionListener { println("clicked") }