对象方法
Java中的java.lang.Object定义如下:
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
protected native Object clone() throws CloneNotSupportedException;
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {...}
public final void wait() throws InterruptedException {
wait(0);
}
protected void finalize() throws Throwable { }
}
当 Java 类型导入到 Kotlin 中时,类型 java.lang.Object
的所有引用都成了 Any
。Any
只声明了 toString()
、hashCode()
和 equals()
函数。怎样才能用到 java.lang.Object
的其他成员方法呢?下面我们来看下。
wait()/notify()
《Effective Java》 第 69 条中建议优先使用并发工具(concurrency utilities)而不是 wait()
和 notify()
。因此,类型 Any
的引用没有提供这两个方法。
如果我们真的需要调用它们的话,可以将其转换为 java.lang.Object
来使用:
(foo as java.lang.Object).wait()
getClass()
要取得对象的 Java 类,我们可以在类引用上使用 java
扩展属性,它是Kotlin的反射类kotlin.reflect.KClass的扩展属性。
val fooClass = foo::class.java
上面的代码使用了自 Kotlin 1.1 起支持的绑定类引用。我们也可以使用 javaClass
扩展属性。
val fooClass = foo.javaClass
clone()
要覆盖 clone()
,需要继承 kotlin.Cloneable
:
class Example : Cloneable {
override fun clone(): Any { …… }
}
要谨慎地改写clone方法。
finalize()
要覆盖 finalize()
,我们只需要声明它即可,不用再写 override关键字:
class C {
protected fun finalize() {
// 终止化逻辑
}
}
当前内容版权归 JackChan1999 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 JackChan1999 .