?與Java不同的是瘪板,在kotlin中捂龄,類是沒有顯式的static方法和static成員變量的,都是通過伴生對象的形式間接提供的涝婉。下面來談談Kotlin中的伴生對象哥力。
?1. 對象聲明,object declaration墩弯,如下所示:
object MyObject {
fun method() {
println("MyObject method")
}
}
fun main(args: Array<String>) {
MyObject.method()
}
?2. 伴生對象吩跋,companion object,
- 在大多數(shù)情況下渔工,kotlin推薦的做法是使用包級別的函數(shù)來作為靜態(tài)方法锌钮,kotlin會將包級別的函數(shù)當作靜態(tài)方法來看待;
- 在kotlin中引矩,一個類中只能有一個伴生對象梁丘,伴生對象的名字可以省略,如果省略(不提供伴生對象的名字)旺韭,那么編譯器會提供一個默認的名字Companion氛谜。如下所示:
class MyCompanion {
companion object MyObject {
var a:Int = 100
@JvmStatic
fun method() {
println("method invoked")
}
}
}
fun main(args: Array<String>) {
MyCompanion.MyObject.method() // 演示用,實際會省略MyObject
println("--------------")
println(MyCompanion.a)
MyCompanion.method() // 類似于靜態(tài)方法区端,kotlin中沒有靜態(tài)方法
println("--------------")
println(MyCompanion.javaClass)
}
注意:
- 雖然伴生對象的成員看起來像是Java中的靜態(tài)成員值漫,但在運行期它們依舊是真實對象的實例成員;
- 在JVM上织盼,可以將伴生對象的成員真正生成為類的靜態(tài)方法和屬性惭嚣,這是通過@JvmStatic注解實現(xiàn)的;
- 伴生對象在編譯后會生成一個靜態(tài)內(nèi)部類悔政。
?利用javap命令對伴生對象MyCompanion反編譯后的結果如下:
? kotlin-lecture javap com.ssy.kotlin.MyCompanion
Compiled from "HelloKotlin19.kt"
public final class com.ssy.kotlin.MyCompanion {
public static final com.ssy.kotlin.MyCompanion$MyObject MyObject;
public com.ssy.kotlin.MyCompanion();
static {};
public static final int access$getA$cp();
public static final void access$setA$cp(int);
public static final void method();
}
通過上面的結果可以看出晚吞,加了@JvmStatic注解,會出現(xiàn)一個static的method()方法谋国。
下面將@JvmStatic注解注釋掉后槽地,重新用javap進行反編譯,結果如下:
? kotlin-lecture javap com.ssy.kotlin.MyCompanion
Compiled from "HelloKotlin19.kt"
public final class com.ssy.kotlin.MyCompanion {
public static final com.ssy.kotlin.MyCompanion$MyObject MyObject;
public com.ssy.kotlin.MyCompanion();
static {};
public static final int access$getA$cp();
public static final void access$setA$cp(int);
}
通過上面的結果可以看出芦瘾,@JvmStatic注解注釋后捌蚊,static的method()方法沒有了。
從上面可以得出結論:伴生對象中的方法上加與不加@JvmStatic近弟,對程序調(diào)用上(對使用者)是沒有任何影響的缅糟,只是在底層的字節(jié)碼形式上存在明顯的差別。
好了祷愉,就先寫到這里窗宦。