我有一个如下界面。
我在Eclipse中获得了这个默认代码。困惑,为什么“@Override”属性即将到来?
在我们声明所有这些方法并稍后在Object类中实现的是否有其他TOP级别的默认接口可用?
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类没有实现我的接口。
答案 0 :(得分:6)
所有类都隐式扩展Object
,已经实现了toString()
。由于您的Record
类实现了您的界面,并从toString()
继承了Object
方法,因此合同已经完成。
答案 1 :(得分:2)
在我们声明所有这些方法并稍后在Object类中实现的是否有其他TOP级别的默认接口可用?
来自Java Language Specification:
如果接口具有没有直接超接口,则接口隐式声明带有签名s的公共抽象成员方法 m,返回类型r和throws子句t 对应于每个公共实例方法 m与签名s,返回类型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"
请参阅问题第二部分的其他答案。
答案 2 :(得分:1)
接口不是从Object
继承的,但任何实现接口的类都将继承,因此默认情况下会实现。
您可能想知道为什么Eclipse会在您的界面模板中为您提供默认覆盖的toString
:我认为它可以提醒您稍后将toString
实现为有意义的内容。
答案 3 :(得分:1)
每个类在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,对应于具有签名s的每个公共实例方法m,返回类型r和throws子句t在Object中声明。
这就是为什么你可以看到toString()方法上面的覆盖注释。
现在,当您实现IRecord类时,您的实现类也扩展了Object类,它具有toString()方法。因此,它不需要在这里实现它。
答案 4 :(得分:0)
@Override属性用于编译器安全性。这只是为了确保你真的有意义覆盖一个方法并且你没有错误地完成它
答案 5 :(得分:0)
因为Object
是所有其他类的基类和Object类中定义的toString
方法,所以它已经实现了。