伴生对象java
伴生对象(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
。this
变量类型:可空指针
kotlin的特性之一是类型安全。定义变量时须要定义该变量是否为空,一旦要求变量不能为空,那后续的空指针问题天然也不复存在。咱们先来看kotiln里是如何定义变量的:code
java: String str = "test"; final String str2 = "test2"; String str3; kotlin: var str = "test" val str2 = "test2" var str3:String ?= null
kotlin使用var,val关键字定义变量,若是在定义变量时直接赋值,则能够不用指定变量类型,不然须要在变量名后使用“:”来指定类型。在类型后加“?”表示该变量可空。若是变量可空,那在后续使用变量时,就必须先判断是否为空。 另外从代码中能够看出很重要的一点,那就是:今后不再用写分号啦orm
var a:Int = null //错误,类型后没?,即不可空类型,天然不能等于null var 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等)。it
Java四类八种基础类型io
java基本数据类型:四类八种form
数值型:整型 byte short int long 非数值:字符型 char
浮点型 float double 布尔 boolean