频道栏目
首页 > 资讯 > 其他 > 正文

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

17-06-08        来源:[db:作者]  
收藏   我要投稿

类成员

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

属性

声明属性 :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") }
相关TAG标签
上一篇:排序之三:简单选择排序(C语言实现)
下一篇:java语法 java学习注意事项 java学习的系统方法
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站