官方文檔: http://kotlinlang.org/docs/reference/java-to-kotlin-interop.html
4.靜態字段(Static Fields)
在對象(object)或伴生對象(companion object)中聲明的Kotlin屬性,有靜態的幕后字段(backing fields)!
這些靜態字段是私有private,但可通過以下方式暴露(公開public):
@JvmField 注解
lateinit 修飾符
const 修飾符
1.用@JvmField注解屬性,使對應的java靜態字段與kotlin屬性可見性相同(默認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修飾屬性,使對應的靜態字段與屬性訪問器setter可見性相同(默認public)
// kotlin
object Singleton {
lateinit var provider: Provider // lateinit 延遲初始化
}
// Java
Singleton.provider = new Provider(); // provider字段是 public static 非final
3.用const修飾的(在類中以及在頂層)屬性,在Java中會成為public靜態字段
// 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.靜態方法(Static Methods)
如果在對象(object)或伴生對象(companion object)中的函數被@JvmStatic注解,
那么編譯器既會在該對象的類中生成靜態方法,也會在對象自身中生成實例方法!
此外,@JvmStatic注解也可用于對象或伴生對象的屬性,使其getter和setter方法是靜態成員!
示例1:
// kotlin
class C {
companion object {
@JvmStatic fun foo() {}
fun bar() {}
}
}
// Java
C.foo(); // OK,靜態方法
C.bar(); // 錯誤,不是靜態方法
C.Companion.foo(); // OK,實例方法
C.Companion.bar(); // OK,實例方法
示例2:
// kotlin
object Obj {
@JvmStatic fun foo() {}
fun bar() {}
}
// Java
Obj.foo(); // OK,靜態方法
Obj.bar(); // 錯誤,不是靜態方法
Obj.INSTANCE.bar(); // OK,單例方法
Obj.INSTANCE.foo(); // OK,單例方法
6.可見性(Visibility)
Kotlin可見性與Java的映射關系:
private成員編譯成Java的private成員;
private頂層聲明編譯成Java的包級局部聲明(package-local);
protected編譯成Java的protected(Java允許訪問同包中其它類的protected成員,所以Java類會訪問權限更廣);
internal聲明編譯成Java的public;
public編譯成Java的public;
7.KClass
有時在java中調用Kotlin函數(有KClass類型參數),但無法把Java的Class自動轉換成kotlin的KClass,
所以必須通過調用Class<T>.kotlin擴展屬性來手動轉換:
kotlin.jvm.JvmClassMappingKt.getKotlinClass(MainView.class)
簡書:http://www.lxweimin.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