美文网首页
2.Kotlin属性和字段

2.Kotlin属性和字段

作者: 世界是一个圆_ | 来源:发表于2018-10-03 20:41 被阅读0次

1.两个关键字

Kotlin的类和接口都可以有属性,修饰属性的关键字有var(可变的)和val(不可变的)。

1.1var

对于var来说,它具有setter和getter,声明一个属性的完整语法是:

var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]

比如:

var stringRepresentation: String
    get() = this.toString()
    set(value) {
        setDataFromString(value) // 解析字符串并赋值给其他属性
    }

自 Kotlin 1.1 起,如果可以从 getter 推断出属性类型:

val isEmpty get() = this.size == 0  // 具有类型 Boolean
1.1.1自定义setter和getter

一般情况下,我们不需要对setter和getter进行自定义,编译器已经默认实现了它们,如果需要自定义的话如下:

class ExampleUnitTest {

    var visibal: String = "aa"
        get() = field
        set(value) {
            field = value + "cc"
        }


    @Test
    fun testMain() {

        println(visibal)//输出aa
        visibal = "bb"
        println(visibal)//输出bbcc
    }
}

其中的field称为幕后字段,它只能在setter和getter中访问,如果不通过field改变值,使用如下方式会报堆栈溢出,因为会递归调用setter

 var visibal: String = "aa"
        get() = field
        set(value) {
            visibal = "aaa"
        }
1.2val

val只有getter没有setter

2.接口中的属性

上面介绍的属性是基于类的,你也可以在接口中定义属性。在接口中声明的属性要么是抽象的,要么提供访问器的实现。在接口中声明的属性不能有幕后字段(backing field),因此接口中声明的访问器不能引用它们。

interface MyInterface {
    val prop: Int // 抽象的
    //声明了访问器
    val propertyWithImplementation: String
        get() = "foo"

    fun foo() {
        print(prop)
    }
}

class Child : MyInterface {
    override val prop: Int = 29
}

3.属性的覆盖 力求清晰显式。与 Java 不同,Kotlin 需要显式标注可覆盖的成员(我们称之为开放)以及覆盖后的成员:

open class Foo {
    open val x: Int get() { …… }
}

class Bar1 : Foo() {
    override val x: Int = ……
}

你也可以用一个 var 属性覆盖一个 val 属性,但反之则不行。这是允许的,因为一个 val 属性本质上声明了一个 getter 方法,而将其覆盖为 var 只是在子类中额外声明一个 setter 方法。

请注意,你可以在主构造函数中使用 override 关键字作为属性声明的一部分。

interface Foo {
    val count: Int
}

class Bar1(override val count: Int) : Foo

class Bar2 : Foo {
    override var count: Int = 0
}

相关文章

  • 2.Kotlin属性和字段

    1.两个关键字 Kotlin的类和接口都可以有属性,修饰属性的关键字有var(可变的)和val(不可变的)。 1....

  • 属性和字段

    字段(Field) 是一种表示与对象或类关联的变量的成员。通常情况下,应仅对具有 private 或 protec...

  • kotlin属性和字段

    Kotlin的类可以有属性。 属性可以用关键字var声明为可变的,否则使用只读关键字val。 Getters 和 ...

  • MySql基本操作语句(不包含查询)

    数据操作 1.添加记录 不列出属性字段 列出属性字段 一次性插入多条数据,可以列出属性字段名 也可以不列出属性字段...

  • 4. 属性

    1. 定义: 属性结合了字段和方法的多个方面。 对于对象的用户,属性显示为字段,访问该属性需要相同的语法。 对于类...

  • 12.属性

    1. 定义: 属性结合了字段和方法的多个方面。 对于对象的用户,属性显示为字段,访问该属性需要相同的语法。 对于类...

  • 抽象类与接口的区别(abstract与interface的区别)

    (1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。 (2) ...

  • Kotlin的属性和字段

    Kotlin的属性相当于Java的字段再加上getter和setter方法。 一、读写属性和只读属性 Kotlin...

  • C#之属性

    属性:get { //读属性代码 } set { //写属性代码 } 属性结合了字段和方法的多个方面。 对于对象的...

  • Django 模型层 orm 单表操作

    一、ORM用法 1.字段类型: 属性名 = models.字段类型(定义属性时需要指定字段类型, 通过字段类型的参...

网友评论

      本文标题:2.Kotlin属性和字段

      本文链接:https://www.haomeiwen.com/subject/gvhtaftx.html