对象方法

Java中的java.lang.Object定义如下:

  1. public class Object {
  2. private static native void registerNatives();
  3. static {
  4. registerNatives();
  5. }
  6. public final native Class<?> getClass();
  7. public native int hashCode();
  8. public boolean equals(Object obj) {
  9. return (this == obj);
  10. }
  11. protected native Object clone() throws CloneNotSupportedException;
  12. public String toString() {
  13. return getClass().getName() + "@" + Integer.toHexString(hashCode());
  14. }
  15. public final native void notify();
  16. public final native void notifyAll();
  17. public final native void wait(long timeout) throws InterruptedException;
  18. public final void wait(long timeout, int nanos) throws InterruptedException {...}
  19. public final void wait() throws InterruptedException {
  20. wait(0);
  21. }
  22. protected void finalize() throws Throwable { }
  23. }

当 Java 类型导入到 Kotlin 中时,类型 java.lang.Object 的所有引用都成了 AnyAny只声明了 toString()hashCode()equals() 函数。怎样才能用到 java.lang.Object 的其他成员方法呢?下面我们来看下。

wait()/notify()

《Effective Java》 第 69 条中建议优先使用并发工具(concurrency utilities)而不是 wait()notify()。因此,类型 Any 的引用没有提供这两个方法。

如果我们真的需要调用它们的话,可以将其转换为 java.lang.Object来使用:

  1. (foo as java.lang.Object).wait()

getClass()

要取得对象的 Java 类,我们可以在类引用上使用 java 扩展属性,它是Kotlin的反射类kotlin.reflect.KClass的扩展属性。

  1. val fooClass = foo::class.java

上面的代码使用了自 Kotlin 1.1 起支持的绑定类引用。我们也可以使用 javaClass 扩展属性。

  1. val fooClass = foo.javaClass

clone()

要覆盖 clone(),需要继承 kotlin.Cloneable

  1. class Example : Cloneable {
  2. override fun clone(): Any { …… }
  3. }

要谨慎地改写clone方法。

finalize()

要覆盖 finalize(),我们只需要声明它即可,不用再写 override关键字:

  1. class C {
  2. protected fun finalize() {
  3. // 终止化逻辑
  4. }
  5. }