一、Any vs Object,兩個類的成員變量的差異。
public open class Any {
public open operator fun equals(other: Any?): Boolean
public open fun hashCode(): Int
public open fun toString(): String
}
public class Object {
public boolean equals(Object obj) {}
public int hashCode() {}
public String toString() {}
public final native void wait() throws InterruptedException;
public final void wait(long millis) throws InterruptedException {}
@FastNative
public final native void notify();
@FastNative
public final native void notifyAll();
...
}
可以看到Any類只有3個成員方法,equals()、hashCode()、toString(),而Object的成員更豐富,不止有這三個方法。
還有wait()、notify()等方法。
二、Any類只在編譯期存在,runtime時Any類就是Object類
Object是java的祖先類,Any是kotlin的祖先類。the root of the class hierarchy。
但是實際上runtime時沒有Any類,在虛擬機運行時,Any類就是Object類。Any類只在編譯期存在。
我們先來看一個demo:
將Any對象強制轉換爲Object是否會崩潰?
類型強制轉換後,調用Object纔有的方法,是否會崩潰?
然後,打印Any對象的類的名稱。
fun main() {
val anyObj = Any()
val obj = anyObj as Object//將Any對象強制轉換爲Object是否會崩潰?
synchronized(obj) {
obj.wait(100)
}
println("anyObj:$anyObj ; obj:$obj")
println("---------------------------------")
println("anyObjClass:${anyObj.`class`} ; objClass:${obj.`class`}")
}
輸出日誌:並沒有崩潰
我們找到如下官方文檔:
https://kotlinlang.org/docs/reference/java-interop.html#mapped-types
文檔的大致意思是,在編譯期,當kotlin代碼中混合使用java類和一些java文件的代碼時,並不會直接使用java的一些特殊類型進行編譯,而是將其映射爲kotlin的相關類。但是但是但是,最終在jvm虛擬機中運行時,映射的類和被映射的類是同一個類。也就是說,java類型映射到kotlin類型,僅僅只在編譯期,在運行期,兩個類型沒有區別。
如:Object 會被映射成kotlin的Any! 類型來編譯,但實際在jvm中運行時,Any類就是Object類。
三、Any類的擴展方法和屬性
雖然,Any類中只定義了三個成員方法,equals()、hashCode()、toString(),但是一個Any對象,我們能使用的方法遠不止這三個方法。
如:javaClass、let、also、takeIf等等
這些成員,是 Extension Properties 和 Extension Functions ,在Any類外定以的。
先挖個坑,後面我們有機會再單獨總結下 kotlin 的 Extension Properties和Extension Functions。
更多kotlin 精彩總結:https://juejin.im/collection/5e546b46e51d45364b886612
參考資料:
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/#any
https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html
https://stackoverflow.com/questions/38761021/does-any-object
https://kotlinlang.org/docs/reference/java-interop.html#mapped-types
https://juejin.im/post/5eb1380f6fb9a0432c4c94b0
關鍵詞:kotlin、Any、java、Object、 Any vs Object、Any和Object的差異