對象聲明
我們都知道在在Java中 不可能單純有一個對象存在的,對象一定是通過類來創建它的實例的,通過new這個關鍵字來創建一個類的對象,這樣呢,這個對象纔會在內存當中創建出來。
在Kotlin當中,有這麼一個新的概念,可以直接聲明個對象,我們定義一個類用class關鍵字,我們聲明一個對象就用object關鍵字。它的語法呢和Kotlin類的語法是極爲相似的。
object MyObject{
}
這就是對象聲明,並且它總是在 object 關鍵字後跟⼀個名稱。表示我聲明瞭一個對象,對象的名字叫MyObject。對象是可以擁有屬性也可以擁有方法的,跟類是一樣的。
object MyObject {
fun method() {
}
}
定義好對象之後呢,就可以直接調用了
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
MyObject.method()
}
因爲本身就是一個對象了,不需要像類一樣要創建實例,可以直接調用方法。這就被稱作對象聲明。
伴生對象
在Kotlin中,與Java不同的是,類是沒有static方法的。在大多數情況下,Kotlin推薦的做法是使用包級別的函數作爲靜態方法。
所以Kotlin會將包級別的函數當做靜態方法來看待。
什麼叫伴生對象,就是隨着類的存在而存在。
class MyTest {
companion object MyObject{
}
}
我創建了一個MyObject的伴生對象,它隨着外面的類MyClass的而存在。
class MyTest {
companion object MyObject {
var num: Int = 100
fun method() {
println("method invoked")
}
}
}
在裏面定義了成員變量num和method方法。這裏面的語法和普通的類是一樣的,但是這個伴生對象到底會起一個什麼樣的作用呢?
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
MyTest.MyObject.method()
}
使用裏面的method()方法,還可以通過用類名直接調用方法和屬性:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
MyTest.method()
MyTest.num
}
這類似於Java中的靜態方法,這就是伴生對象所起到的重要作用。
還可以把伴生對象名字省略掉,也是可以的。因爲我們直接用類名調用屬性和方法,這個名字是無用的。
class MyTest {
companion object {
var num: Int = 100
fun method() {
println("method invoked")
}
}
}
請注意,即使伴⽣對象的成員看起來像其他語⾔的靜態成員,在運⾏時他們仍然是真實對象的實例成 員,我們可以使⽤ @JvmStatic
註解,你可以將伴⽣對象的成員⽣成爲真正的靜態⽅法和 字段。