Java 接口实例如何访问对象类的方法?

Java 接口实例如何访问对象类的方法?,java,Java,一个朋友给我看了这个代码,我无法向他解释 我们知道,在“referenced”对象中定义的方法只能在实例上运行。 正如我们所看到的,Intf没有定义任何方法,但是obj(它指的是Intf)能够调用Object.class的toString()方法 我安慰他说一切都是Java中的对象(尽管我们在eclipse IDE中没有针对Intf的自动填充选项) 正如我们所见,Intf 实际上,在Intf中有一个隐式声明的toString方法 每个接口(不显式扩展另一个接口)在对象中为每个公共方法都有一个隐式

一个朋友给我看了这个代码,我无法向他解释

我们知道,在“referenced”对象中定义的方法只能在实例上运行。 正如我们所看到的,
Intf
没有定义任何方法,但是obj(它指的是
Intf
)能够调用Object.class的
toString()
方法

我安慰他说一切都是Java中的对象(尽管我们在eclipse IDE中没有针对
Intf
的自动填充选项)

正如我们所见,
Intf

实际上,在
Intf
中有一个隐式声明的
toString
方法

每个接口(不显式扩展另一个接口)在
对象
中为每个公共方法都有一个隐式方法声明

Java语言规范对此进行了详细解释

9.2接口成员 [……]

  • 如果一个接口没有直接的超级接口,那么该接口隐式声明一个公共抽象成员方法m,其签名为s,返回类型为r,并抛出与每个公共实例方法m对应的子句t,其签名为s,返回类型为r,抛出子句t在
    对象中声明,除非接口显式声明具有相同签名、相同返回类型和兼容throws子句的方法
[……]


问题是什么?你的最后一句话就是答案:Java中的Everything extends Object我不确定你的问题是什么,因为你是对的

接口只是一个契约,表示实现它的类需要指定某些方法。在这种情况下,
Intf
接口是不可操作的,因为它对实现者没有附加要求

因此,您的示例在功能上与

interface Intf {
}

class A implements Intf {
}

class Test {    
    public static void main(String[] args) {
        Intf obj = new A();
        obj.toString();
    }
}
当您知道所有类都扩展了
java.lang.Object
并继承了它的方法时,您会惊讶于可以为该类调用
obj.toString()


即使在涉及更复杂接口的情况下,它们也只是对类必须实现的内容提出了更多的要求。但是,所有类最终都从
对象继承,因此在它们上面定义了这些方法。

Java中的每个对象都将从对象继承,所以无论您创建什么对象,它都将包含一个
toString()

您正在实现一个不定义任何方法和属性的接口。实际上,这意味着您的类不必定义任何特定的方法/属性(尽管您可以自由定义任何您想要的方法/属性,但是没有定义特定方法/属性的契约)

Java中的每个类都继承自Java.lang.Object,它提供了几个基本方法,包括toString()。这意味着您的类可以访问所有这些方法


请参阅:

Chceck,也请参阅。很久以前我也问过同样的问题


没有接口不继承对象类,但它提供了对象类的所有方法的可访问性。 接口的成员是:

在接口中声明的那些成员

那些成员是从直接上级界面继承来的

如果接口没有直接的超级接口,则该接口隐式声明一个公共抽象成员方法,该方法对应于对象类中声明的每个公共实例方法。

如果接口在对象中将m声明为final的情况下显式声明这样的方法m,则这是编译时错误

现在很明显,所有superinterface都有与Object中声明的每个公共实例方法相对应的抽象成员方法。
资料来源:

+1。这绝对是我在stackoverflow.com上看到的最好的问题之一。但是接口并不像类那样正式扩展任何“根”接口。在本例中,
obj
的类型是
Intf
,因此在我看来,这显然是一个合法的问题。所有类最终都从Object继承,并因此在其上定义了这些方法。-但是,所有接口都不会像类那样隐式扩展任何“根”接口。在本例中,
obj
的静态类型是
Intf
,因此,从您的解释(以及方法分派的JLS描述)来看,您不清楚应该能够执行
obj.toString()
。这一点很好;我更多的是从动态类型实现的角度来解决这个问题,但是您的回答正确地指出了为什么编译器可以“看到”
Intf.toString()
。对,但是这里的
obj
的静态类型是
Intf
,它实际上不是从
对象继承的,因为它是一个接口。但是请记住,无论每个对象从对象继承什么。这是含蓄的。意思是:类A实现了Intf,即使你看不到它的真正含义。类A扩展对象实现IntfAnd,这还不是全部。这同样有效,我怀疑这是在JLS中的其他地方定义的:
intfi=。。。。;对象o=i对。其中提到,
Object
是任何接口类型的超类型,在回答这个问题时,它可能也是一个有效的参考。
class A {}