为什么Java中Object的interfaces子类型是?

时间:2019-05-06 19:52:06

标签: java interface subtyping

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

2 个答案:

答案 0 :(得分:1)

接口只是其子类的“规范”。他们通常不提供任何实现。因此,从本质上讲,接口是在Java中查看对象的最抽象方式。但是,Java 8和更高版本提供了实现的defaultstatic方法,因此这使得接口与抽象类更加相似。 由于每个对象都继承自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"
}

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

答案 1 :(得分:1)

  

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

实际目的是可以使用类型为接口的变量(最常见的是toString()equals()hashCode()来调用Object方法。

为了使接口类型的变量具有非空值,必须为其分配对象实例。由于所有对象都扩展了Object,因此可以确保任何实现该接口的对象都扩展了Object

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