Kotlin学习手册(二)属性与字段

如需转载请评论或简信,并注明出处,未经允许不得转载

Kotlin系列导读

Kotlin学习手册(一)类与继承
Kotlin学习手册(二)属性与字段
Kotlin学习手册(三)接口
Kotlin学习手册(四)内部类
Kotlin学习手册(五)函数
Kotlin学习手册(六)数组与集合
Kotlin学习手册(七)for循环
Kotlin学习手册(八)内联函数let、with、run、apply、also
Kotlin学习手册(九)空类型安全
Kotlin学习手册(十)带你真正理解什么是Kotlin协程

目录

声明属性

.java

public class Address {
    private final String name = "西溪";
    private String city = "杭州";
    private boolean isEast = true;
    private int zip = 123456;
    public String state;
    protected boolean isCapital;

    public String getName() {
        return name;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public boolean isEast() {
        return isEast;
    }

    public void setEast(boolean east) {
        isEast = east;
    }
}

.kotlin

Kotlin 类中的属性既可以用关键字 var 声明为可变的(get&set),也可以用关键字 val 声明为只读的(get)

class Address {
    val name = "西溪"
    var city = "杭州"
    var isEast = true
    private val zip = 123456
    var state: String? = null
    protected var isCapital: Boolean = false
}

get & set

.java

public class Person {
    private String name;

    public String getName() {
        return name + "sir";
    }

    public void setName(String name) {
        this.name = "geek" + name;
    }
}

.kotlin

kotlin会自动帮我们生成get&set,但是我们也可以自己定义

注意:set&get中如果要用到当前变量,不能直接引用,需要用field字段来代表当前变量,否则会死循环

class Person {
    var name: String? = null
            //这里不能直接使用name,而要使用field
        get() = field + "sir"
        set(value) {
            field = "geek$value"
        }
}

static属性

.java

public class Address {
    private static String name = "杭州";
    private String street = "西溪街道";

    public static String getName() {
        return name;
    }

    public static void setName(String name) {
        Address.name = name;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }
}

.kotlin

kotlin中需要将静态变量放入companion object代码块

class Address {
    var street = "西溪街道"

    companion object {
        var name = "杭州"
    }
}

延迟初始化属性

正常情况下,kotlin不允许声明一个未被初始化的属性(除了abstract的属性)

[图片上传失败...(image-67d5c8-1572176349512)]

但是我们可以通过lateinit关键字延迟初始化属性

.kotlin

class Address {
    lateinit var name: String
}

在初始化前访问一个 lateinit 属性会抛出一个特定异常,该异常明确标识该属性被访问及它没有初始化的事实

kotlin.UninitializedPropertyAccessException: lateinit property name has not been initialized

可以通过下面这种方法检测一个 lateinit var 是否已经初始化过

if (address::name.isInitialized) {
    println(address.name)
}

属性覆盖

子类可以用override关键字复写父类中的open属性

.kotlin

open class Person {
    open var name: String? = null
}

class Man : Person() {
    override var name: String? = "geekholt"
}

kotlin中的属性可以声明为abstract,如果一个类中有abstract属性,那么这个类也是abstract

.kotlin

abstract class Person {
    abstract var name: String
}

class Man : Person() {
    override var name: String = "geekholt"
}

你可能感兴趣的:(Kotlin学习手册(二)属性与字段)