Kotlin-属性和赋值

要想使用kotlin的各个属性,先得声明Kotlin类

变量

Kotlin中类的属性可以用var或者val关键字进行声明,其中var为可变属性,val为只读属性(相当于Java的final)。

class Student {
    var name = "名字" //名字属性可变,用var
    val birthday = "1994-10-26" //生日属性不可变,用val
}

像上面这样就简单的为Student类声明了name和birthday两个属性,且在声明属性时进行了初始化,按照Kotlin的类型推断特点,name和birthday就是属于String类型。现在我想为Student类添加一个age属性,但是我并不想在声明时进行初始化,用Java写起来非常简单即可实现

public class JavaStudent {
    private String name = "名字";
    private String birthday = "1994-10-26";
    private int age;//Java版的实现
}

按照Java的实现套路直接套入Kotlin你会发现IDE直接报错并提示property must be initialized or be abstract

按照提示我们必须把类和字段都声明为abstract才可以通过编译。
abstract class Student {
    var name = "名字" //名字属性可变,用var
    val birthday = "1994-10-26" //生日属性不可变,用val
    abstract var age: Int
}

这样未免太过麻烦,而且理解起来也非常奇怪。Kotlin提供了延迟初始化的方式来解决初始化的问题,使用关键字lateinit即可,这样就无需声明abstract了。

可惜使用lateinit延迟初始化age之后,IDE依旧报错,这次提示的内容是lateinit modifier is not allowed on primitive type properties。Kotlin并不支持对原生类型进行lateinit,为什么呢?因为Kotlin会使用null来对每一个用lateinit修饰的属性做初始化,而基础类型是没有null类型,所以无法使用lateinit。这点很好理解,就像可以把int型变量赋值为0,却无法赋值为null一样。所以这里为了通过IDE的编译,我们可以采用两种方案,要么还是直接在age声明时进行初始化,要么不用基础类型来定义age。

class Student {
    var name = "名字" //名字属性可变,用var
    val birthday = "1994-10-26" //生日属性不可变,用val
    var age = 0 //直接使用0初始化age,age为Int型
    lateinit var ageStr: String //String不是基础类型,可以使用lateinit初始化
}

 


版权声明:本文为u012693479原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。