Object类的接口访问方法实例怎么样?

时间:2011-06-03 11:55:34

标签: java

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获得自动填充选项)

7 个答案:

答案 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)

同时检查一下。我有一段时间回答了同样的问题

Do interfaces inherit from Object class in java