伴生对象
伴生对象(companion object )类似于java中的静态关键字static。在Kotlin没有这个关键字,而是伴生对象,具体用法
open class People constructor(var id: String, var name: String){ //可以类中初始化属性: var customName = name.toUpperCase() //初始化属性 //使用constructor前缀声明,且必须调用primary constructor,使用this关键字 constructor( id: String, name: String, age: Int) : this(id, name) { println("constructor") } init { println("初始化操作,可使用constructor参数") } //,Kotlin的class并不支持static变量,所以需要使用companion object来声明static变量, // 其实这个platformStatic变量也不是真正的static变量,而是一个伴生对象, companion object { val ID = 1 }}
使用的话直接People.ID
。
变量类型:可空
kotlin的特性之一是类型安全。定义变量时需要定义该变量是否为空,一旦要求变量不能为空,那后续的空指针问题自然也不复存在。我们先来看kotiln里是如何定义变量的:
java:String str = "test";final String str2 = "test2";String str3;kotlin:var str = "test"val str2 = "test2"var str3:String ?= null
kotlin使用var,val关键字定义变量,如果在定义变量时直接赋值,则可以不用指定变量类型,否则需要在变量名后使用“:”来指定类型。在类型后加“?”表示该变量可空。如果变量可空,那在后续使用变量时,就必须先判断是否为空。 另外从代码中可以看出很重要的一点,那就是:从此再也不用写分号啦
var a:Int = null //错误,类型后没?,即不可空类型,自然不能等于nullvar a:Int? = null //正确val canNull: Int ? = 0 canNull.toFloat //错误,可空变量调用时要判断空canNull?.toFloat //正确,(如果是null,什么都不做)canNull!!.Float //正确,(如果null,报空指针)val canNotNull: Int = 0 canNotNull.toFloat //正确
那如果在定义变量时(例如定义成员变量),又想该变量不为空,又不想子定义时就初始化要怎么办呢?使用lateinit关键字
lateinit var test:String //正确lateinit val test:String //错误lateinit var test:Float //错误
可见,lateinit修饰符只能修饰不可空类型,并且不允许修饰基础类型(四类八种基础类型int, double,boolean等)。
Java四类八种基础类型
java基本数据类型:四类八种
数值型:整型 byte short int long 非数值:字符型 char
浮点型 float double 布尔 boolean