【发布时间】:2014-12-12 09:18:37
【问题描述】:
如果一个接口没有继承Object类,那么为什么接口引用了toString()、hashCode()等Object的方法。
【问题讨论】:
-
@JohanKarlsson 这个问题对我来说似乎很清楚——你不清楚哪一部分?
标签: java
如果一个接口没有继承Object类,那么为什么接口引用了toString()、hashCode()等Object的方法。
【问题讨论】:
标签: java
因为这就是语言的设计方式。任何实现接口的类肯定会有Object作为最终祖先,所以在执行时,这些方法肯定是可用的。
这是在JLS 9.2中指定的:
如果一个接口没有直接的超接口,则该接口隐式声明一个公共抽象成员方法
m,签名为s,返回类型r,以及每个公共实例方法@987654327对应的throws子句t@ 带有签名s、返回类型r和在Object中声明的 throws 子句t,除非接口显式声明了具有相同签名、相同返回类型和兼容 throws 子句的抽象方法。
【讨论】:
在 Java 中,everything 是 Object 的子类,即使它没有明确声明是这样。所以你声明你的接口,然后任何实现你接口的类都必须是Object的子类,因为一切都是。
因为它是Object 的子类,所以它引入了Object 的所有可见方法,例如.toString()。
【讨论】:
接口的任何实现都必须扩展Object。例如:
SomeInterface foo = new ConcreteImplementation();
这里,ConcreteImplementation 必须扩展 Object,因为它是所有 Java 对象的最终祖先。因此,您可以通过您的foo 变量访问与Object 类关联的所有公共方法。
【讨论】:
ConcreteImplementation 类型的对象。您在 SomeInterface 变量中存储对它的引用这一事实无关紧要。