为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

万千封印 2022-11-10 16:42:43
为什么Java中没有Object的超接口子类型的接口?我在这里要问的是为什么语言创建者会做出这种设计选择,即这种子类型化的实际目的是什么?
查看完整描述

2 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

这种子类型的实际目的是什么?

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

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

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


查看完整回答
反对 回复 2022-11-10
?
小怪兽爱吃肉

TA贡献1852条经验 获得超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"

}

如果可能,请尽量避免使用这种代码。


查看完整回答
反对 回复 2022-11-10
  • 2 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信