Kotlin笔记(七)类成员(属性,内部类,匿名内部类)

来源:互联网 发布:淘宝女模特好漂亮 编辑:程序博客网 时间:2024/05/22 03:26

类成员

  • 构造函数和初始化块 (第六章)
  • 函数 (第五章)
  • 属性
  • 嵌套类和内部类
  • 对象声明

属性

声明属性 :Kotlin的类可以有属性。 var 声明为可变的,val为只读的

声明一个属性的完整语法是

var <属性名称>[: <属性类型>] [= <初始值>]    [<getter>]    [<setter>]//例如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类型的名称为addressfun 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") }
阅读全文
0 0
原创粉丝点击