如果接口没有扩展Object类,那么接口引用为什么显示toString(),hashCode()和其他Object的方法。
答案 0 :(得分:5)
因为这就是语言的设计方式。任何实现接口的类肯定会有Object
作为最终祖先,因此在执行时,这些方法肯定是可用的。
这在JLS 9.2中指定:
如果接口没有直接的超接口,则接口隐式声明带有签名
m
的公共抽象成员方法s
,返回类型r
和throws子句t
对应于m
中具有签名s
,返回类型r
和throws子句t
的每个公共实例方法Object
,除非具有相同的抽象方法签名,相同的返回类型和兼容的throws子句由接口显式声明。
答案 1 :(得分:2)
接口的任何实现都必须扩展Object
。例如:
SomeInterface foo = new ConcreteImplementation();
这里,ConcreteImplementation
必须扩展Object
,因为它是所有Java对象的最终祖先。因此,您可以通过Object
变量访问与foo
类相关联的所有公共方法。
答案 2 :(得分:2)
在Java中,所有都是Object
的子类,即使它没有明确声明是这样的。所以你声明你的接口,然后任何类实现你的接口必须是Object
的子类,因为一切都是。
因为它是Object
的子类,所以它会引入Object
的所有可见方法,例如.toString()
。