官方文檔: http://kotlinlang.org/docs/reference/java-to-kotlin-interop.html
4.靜態(tài)字段(Static Fields)
在對象(object)或伴生對象(companion object)中聲明的Kotlin屬性,有靜態(tài)的幕后字段(backing fields)!
這些靜態(tài)字段是私有private,但可通過以下方式暴露(公開public):
@JvmField 注解
lateinit 修飾符
const 修飾符
1.用@JvmField注解屬性,使對應(yīng)的java靜態(tài)字段與kotlin屬性可見性相同(默認(rèn)public)
// kotlin
class Key(val value: Int) {
companion object {
@JvmField
val COMPARATOR: Comparator<Key> = compareBy<Key> { it.value }
}
}
// Java
Key.COMPARATOR; // COMPARATOR字段是 public static final
2.用lateinit修飾屬性,使對應(yīng)的靜態(tài)字段與屬性訪問器setter可見性相同(默認(rèn)public)
// kotlin
object Singleton {
lateinit var provider: Provider // lateinit 延遲初始化
}
// Java
Singleton.provider = new Provider(); // provider字段是 public static 非final
3.用const修飾的(在類中以及在頂層)屬性,在Java中會成為public靜態(tài)字段
// kotlin代碼(example.kt文件)
object Obj {
const val CONST = 1
}
class C {
companion object {
const val VERSION = 9
}
}
const val MAX = 239
// Java代碼
int c = Obj.CONST;
int v = C.VERSION;
int d = ExampleKt.MAX;
5.靜態(tài)方法(Static Methods)
如果在對象(object)或伴生對象(companion object)中的函數(shù)被@JvmStatic注解,
那么編譯器既會在該對象的類中生成靜態(tài)方法,也會在對象自身中生成實(shí)例方法!
此外,@JvmStatic注解也可用于對象或伴生對象的屬性,使其getter和setter方法是靜態(tài)成員!
示例1:
// kotlin
class C {
companion object {
@JvmStatic fun foo() {}
fun bar() {}
}
}
// Java
C.foo(); // OK,靜態(tài)方法
C.bar(); // 錯(cuò)誤,不是靜態(tài)方法
C.Companion.foo(); // OK,實(shí)例方法
C.Companion.bar(); // OK,實(shí)例方法
示例2:
// kotlin
object Obj {
@JvmStatic fun foo() {}
fun bar() {}
}
// Java
Obj.foo(); // OK,靜態(tài)方法
Obj.bar(); // 錯(cuò)誤,不是靜態(tài)方法
Obj.INSTANCE.bar(); // OK,單例方法
Obj.INSTANCE.foo(); // OK,單例方法
6.可見性(Visibility)
Kotlin可見性與Java的映射關(guān)系:
private成員編譯成Java的private成員;
private頂層聲明編譯成Java的包級局部聲明(package-local)浅浮;
protected編譯成Java的protected(Java允許訪問同包中其它類的protected成員,所以Java類會訪問權(quán)限更廣);
internal聲明編譯成Java的public;
public編譯成Java的public;
7.KClass
有時(shí)在java中調(diào)用Kotlin函數(shù)(有KClass類型參數(shù)),但無法把Java的Class自動(dòng)轉(zhuǎn)換成kotlin的KClass,
所以必須通過調(diào)用Class<T>.kotlin擴(kuò)展屬性來手動(dòng)轉(zhuǎn)換:
kotlin.jvm.JvmClassMappingKt.getKotlinClass(MainView.class)
簡書:http://www.reibang.com/p/042ea2c9062c
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/75332128
GitHub博客:http://lioil.win/2017/07/18/Kotlin-kotlinInJava2.html
Coding博客:http://c.lioil.win/2017/07/18/Kotlin-kotlinInJava2.html