在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吗?