在Java中重写接口内的对象类方法 让我们考虑java中的以下简单代码。< /P> package-tempkg; 接口 { @凌驾 公共抽象布尔等于(java.lang.Object arg); @凌驾 公共抽象字符串toString(); 公开无效显示(); } 最后一个类演示实现了这个接口 { 公开展览( { System.out.println(“调用的方法”); } } 最终公开课主 { 公共静态void main(字符串…参数) { 新演示().show(); } }

在Java中重写接口内的对象类方法 让我们考虑java中的以下简单代码。< /P> package-tempkg; 接口 { @凌驾 公共抽象布尔等于(java.lang.Object arg); @凌驾 公共抽象字符串toString(); 公开无效显示(); } 最后一个类演示实现了这个接口 { 公开展览( { System.out.println(“调用的方法”); } } 最终公开课主 { 公共静态void main(字符串…参数) { 新演示().show(); } },java,Java,在上面的代码片段中,名为interface的接口有一些来自JDK的对象类方法,它们带有@Override注释,即使它们是抽象的。现在,类Demo已经实现了接口,并且没有实现了equals()和toString()方法。编译器仍然没有抱怨,程序正在成功运行。为什么? Java中接口和对象类之间的关系是什么?在接口中实际上并没有覆盖任何内容-根据定义,接口不能为其任何方法提供实现。类Demo只是从对象继承了equals和toString实现 本质上,Java中的接口包含一组零个或多个方法签名(所有方

在上面的代码片段中,名为
interface
的接口有一些来自JDK的对象类方法,它们带有
@Override
注释,即使它们是抽象的。现在,类
Demo
已经实现了
接口
,并且没有实现了
equals()
toString()方法。编译器仍然没有抱怨,程序正在成功运行。为什么?

Java中接口和对象类之间的关系是什么?

接口中
实际上并没有覆盖任何内容-根据定义,接口不能为其任何方法提供实现。类
Demo
只是从
对象继承了
equals
toString
实现

本质上,Java中的接口包含一组零个或多个方法签名(所有方法签名都是隐式抽象的,在代码中通过添加关键字
abstract
)使其显式化),实现接口的具体类必须为这些方法提供实现。在您的代码中,该实现来自
Object
,因为所有类都隐式扩展了
Object
,这为
equals
toString
(以及其他方法)提供了默认实现

您真的不应该在接口中用
@Override
标记方法,正如您所看到的,它很混乱,没有实际用途。相反,在具体类中实现接口方法的方法中使用
@Override
,如下所示:

class Demo implements Interface {
    @Override
    public void show() {
        System.out.println("Method invoked.");
    }
}
此外,完全不需要在接口中声明
等于
toString
,因此最好使用以下定义:

interface Interface {
    public void show();
}

@Override
只能用于基类Object中定义的函数。对象定义了
等于
到字符串
,因此您可以对它们使用
@Override
,但不能对函数show使用。它表示类中的
@Override
函数与其基类(而非派生类)之间的关系。

签出:

如果一个接口没有直接的超级接口,那么该接口隐式声明一个公共抽象成员方法m,其签名为s,返回类型为r,并抛出与每个公共实例方法m相对应的子句t,该公共实例方法m的签名为s,返回类型为r,并且抛出在
对象
中声明的
子句t,除非接口显式声明具有相同签名、相同返回类型和兼容的
throws
子句的方法。如果接口在
对象
中将m声明为
最终
的情况下显式声明这样的方法m,则这是编译时错误

换句话说,每个接口都隐式定义了
对象的每个方法,因此您可以
@覆盖这些方法。其他方法未在
对象中定义,因此无法重写它们

Java语言规范明确指出 接口是在接口中声明的接口和 从直接超级接口继承的。如果接口具有 没有直接的超级接口,则接口隐式声明 每个公共实例对应的公共抽象成员方法 方法,除非具有相同 签名、相同的返回类型和兼容的throws子句 由该接口显式声明。这就是为什么 编译器和 代码编译时没有任何错误。记住,如果接口试图 声明在对象类中声明为“final”的公共实例方法 然后它将导致编译时错误。比如"公 final类getClass()是声明为“final”的公共实例方法 在对象类中,因此如果接口尝试声明 方法,则编译将失败


试图在接口内用
@Override
注释其他方法会导致编译时错误。怎么用?这是一个实际的问题。我知道它没有实际的重要性,但为什么会发生这种情况?当然,它会产生编译时错误,正如我在回答中所说的,您不能在接口中提供方法的实现,当你用@Override标记一个方法时,你是说你要实现它。OP是说当他在一个没有被对象实现的方法上使用注释时,它会发出一个编译时错误。但是当他在equals()和toString()等方法上使用它时,不会发生错误。好吧,这很奇怪。也许编译器只是忽略了接口中的那些方法,因为它们已经存在于Javascript中的每个对象中。bade类是什么?必须是基类。我认为这是一个很好的解释,你能分享一下甲骨文官方网站的确切规格url吗?