为什么Java中接口是Object的子类型? [已关闭]

问题描述 投票:0回答:2

为什么Java中没有超接口的接口是Object的子类型? 我在这里要问的是,为什么语言创建者会采取这种设计选择,即这种子类型的实际目的是什么?

java interface language-design subtyping
2个回答
1
投票

此子类型的实际目的是什么?

实际用途是,您可以使用类型为接口的变量来调用

Object
方法,最常见的是
toString()
equals()
hashCode()

为了使接口类型的变量具有非空值,必须为其分配一个对象实例。由于所有对象都扩展

Object
,因此可以保证任何实现该接口的对象也扩展
Object

例如

List
是一个接口,但即使没有为该接口定义
myList.toString()
,您也可以调用
toString()


1
投票

接口只是其子类的“规范”。他们通常不提供任何实现。因此本质上接口是 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"
}

如果可能,请尽量避免此类代码。

© www.soinside.com 2019 - 2024. All rights reserved.