伴生對象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