[英]Implementation of Interface methods is required or not
我有一个如下界面。
我在Eclipse中获得了这个默认代码。 困惑,为什么“@Override”属性即将到来?
是否有任何其他TOP级别的默认界面可用,我们已经声明了所有这些方法,后来在Object类中实现了?
public interface IRecord {
@Override
public String toString();
public void showName(String name);
}
它的一个实现如下
public class Record implements IRecord{
@Override
public void showName(String name) {
//Doing something
}
}
它正如预期的那样得到很好的顺应但是我很惊讶为什么它不要求我实现toString()
方法的实现?
它在Object类中,但是Object类没有实现我的接口。
所有类都隐式扩展了Object
,它已经实现了toString()
。 由于您的Record
类实现了您的接口,并从Object
继承了toString()
方法,因此合同得以实现。
是否有任何其他TOP级别的默认界面可用,我们已经声明了所有这些方法,后来在Object类中实现了?
从Java语言规范 :
如果接口没有直接的超接口,则接口隐式声明一个公共抽象成员方法 m,其中包含签名s,返回类型r和throws子句t, 对应于具有签名s的每个公共实例方法 m,返回类型r和throws子句t 在Object中声明 ,除非接口显式声明具有相同签名,相同返回类型和兼容throws子句的方法。
换句话说,即使是空接口也会隐式继承Object
所有公共方法。 这就是Eclipse(正确)添加@Override
注释的原因。 由于从Object
中删除了任何方法,它很可能永远不会失败,但它可以帮助避免拼写错误:
interface IRecord {
@Override
public String toSTring();
}
Error: "The method toSTring() of type IRecord must override or implement a supertype method"
请参阅问题第二部分的其他答案。
接口不从Object
继承,但是任何实现接口的类都将是,所以它默认是实现的。
您可能想知道为什么Eclipse在您的界面模板中为您提供默认的重写toString
:我认为它是一个提醒,以便稍后将toString
实现为有意义的东西。
每个类都扩展java中的java.lang.Object ,如果你没有扩展,那么隐式地考虑Object。
只看你的代码:
public interface IRecord {
@Override
public String toString();
public void showName(String name);
}
为什么在toString()方法中有@Override注释,你必须从某个地方获取它,
如JLS中所述:如果接口没有直接的超接口,那么接口隐式声明一个公共抽象成员方法m,其中包含签名s,返回类型r和throws子句t,对应于每个公共实例方法m和签名s,返回类型为r ,并在Object中声明throws子句。
这就是为什么你可以看到toString()方法上面的覆盖注释。
现在,当您实现IRecord类时,您的实现类也扩展了Object类,它具有toString()方法。 因此,它不需要在这里实现它。
@Override属性用于编译器安全性。 这只是为了确保你真的有意义覆盖一个方法而你没有错误地完成它
因为Object
是所有其他类的基类和Object类中定义的toString
方法,所以它已经实现了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.