为什么Java中没有超接口的接口是Object的子类型? 我在这里要问的是,为什么语言创建者会采取这种设计选择,即这种子类型的实际目的是什么?
接口只是其子类的“规范”。他们通常不提供任何实现。因此本质上接口是 Java 中对象最抽象的方式。然而,Java 8 及更高版本提供了
default
和 static
方法以及实现,因此这使得接口更加类似于抽象类。
由于每个对象都继承自 Object 类,并且由于接口只是对象的抽象表示,因此它们也需要继承自 Object。
请注意,每个未显式指定其超类的类、抽象类和接口都会在编译时分配 Object 类作为其直接超类。
这是因为Object类已经提供了一些所有对象都需要实现的方法(例如
equals()
,toString()
,...)。特别有用的方法是在各种哈希表中使用的hashCode()
,或者在编写多线程程序时使用的wait()
、notify()
和notifyAll()
。由于继承,您几乎永远不需要显式调用这些方法,但是,如果类不是从 Object 继承,您将需要为每个类自己编写所有这些方法。因此,对象类在一定程度上减少了编程工作量。
此外,当值未知时,这还可以创建“any”类型的参数。
void printObject(Object any) {
System.out.println("Printing object of type: " + any.getClass().getName());
System.out.println(any); // toString called "implicitly"
}
如果可能,请尽量避免此类代码。