特别是:之间有什么区别
interface A {
void fa();
}
interface B extends A {
void fa();
void fb();
}
和
interface A {
void fa();
}
interface B extends A {
@Override
void fa();
void fb();
}
它会以任何方式影响实现类吗?
不应该。实现interface B
的类仍然必须提供void fa();
的实现,而不管接口B是否用@Override
注释相同的方法签名。此外,在这种情况下,将@Override
注释放在接口B中没有多大意义,因为注释基本上意味着您正在重写超类赋予该方法签名的实现。由于Interface A
和Interface B
都没有为void fa()
提供实现,所以这是没有意义的。
如果interface A
为void fa()
提供了默认实现,这将是有意义的。例如:
interface A {
public default void fa(){
System.out.println("My default implementation");
}
}
在这种情况下,接口B将通过使其再次抽象来覆盖从接口A提供给fa()
的实现。当接口A将fa()
定义为抽象,而接口B通过将其转换为default
方法来为其提供实现时,情况也是如此。
@Override注释只是一个提醒,提醒编译器在定义错误时显示错误。它不会影响任何事情。好的做法是一直写下去。
@Override
不会改变fa
方法的重写行为。它是一个基于名称和参数类型的覆盖(在本例中为none(,而不是其他类型。返回类型需要是兼容的(协变返回(,但不是"返回"的一部分;这是否为超控;决定
@Override
注释(主要(用于验证一个方法是否覆盖了超类型中的方法。如果忽略它,IDE或SonarQube等其他工具可能会发出警告,但编译器并不关心。如果你添加错误,那就是它的真正用途——你会得到一个编译器错误。