interface Intf {
}
class A implements Intf {
}
class Test {
public static void main(String[] args) {
Intf obj = new A();
obj.toString();
}
}
一位朋友给我看了这段代码,我无法向他解释......
我们知道'refer'对象中定义的方法只能在实例上运行。
我们可以看到Intf
没有定义方法,但是obj(引用Intf
)能够调用Object.class的toString()
方法
我安慰他说一切都是Java中的对象(尽管我们在eclipse IDE中没有针对Intf
获得自动填充选项)
答案 0 :(得分:10)
我们看不到
定义的方法Intf
实际上,toString
中有一个隐含声明的Intf
方法。
每个接口(未明确扩展另一个接口)都为Object
中的每个公共方法都有一个隐式方法声明。
Java语言规范§ 9.2 Interface Members中详细解释了这一点。
9.2接口成员
[...]
- 如果接口没有直接的超接口,则接口隐式声明带有签名 s 的公共抽象成员方法 m ,返回类型 r < / em>,并且使用签名 s ,返回类型 r 和throws子句对应于每个公共实例方法m的throws子句 t t 在
Object
中声明,除非接口显式声明具有相同签名,相同返回类型和兼容throws子句的方法。[...]
答案 1 :(得分:2)
我不确定你的问题是什么,因为你是对的。
接口只是一个契约,说实现它的类需要指定某些方法。在这种情况下,Intf
接口是无操作的,因为它对实现者没有额外的要求。
因此,您的示例在功能上与
相同class A {}
当您知道所有课程都延伸obj.toString()
并继承其方法时,您是否会为该课程调用java.lang.Object
会感到惊讶吗?
即使在涉及更多涉及的界面的情况下,它们也只是对类必须实现的内容提出更多要求。但是,所有类最终都继承自Object
,因此在其上定义了这些方法。
答案 2 :(得分:1)
Java中的每个对象都将继承自Object,因此无论您创建什么对象,它都将包含toString()
。
答案 3 :(得分:1)
您正在实现一个不定义方法且没有属性的接口。实际上,这意味着您的类不必定义任何特定的方法/属性(尽管您可以自由定义任何您想要的,但没有合同来定义特定的方法/属性。)
Java中的每个类都继承自java.lang.Object,它提供了几个基本方法,包括toString()。这意味着您的班级可以访问所有这些方法。
请参阅:http://download.oracle.com/javase/6/docs/api/java/lang/Object.html
答案 4 :(得分:1)
No Interface不继承Object类,但它提供了Object类的所有方法的可访问性。 界面的成员是:
在界面中声明的那些成员。
那些成员继承自直接超级接口。
如果接口没有直接的超接口,则接口隐式声明与Object类中声明的每个公共实例方法对应的公共抽象成员方法。
如果接口在将对象声明为m的情况下显式声明了这样的方法m,那么这是一个编译时错误。
现在很清楚,所有的superinterface都有与在Object中声明的每个公共实例方法相对应的抽象成员方法 资源: http://ohmjavaclasses.blogspot.com/2011/11/is-intreface-inherits-object-clashow.html
答案 5 :(得分:0)
问题是什么?你的最后一句话就是答案:Everything在Java中扩展了对象
答案 6 :(得分:0)
同时检查一下。我有一段时间回答了同样的问题