我正在查看Stackoverflow中有关@Override
注释的信息。
我已经知道它会覆盖父方法。但是,我看到一些评论说@Override
实际上可以检查拼写错误,并且在所有方法之前放置@override
注释是非常有用的。
我想知道@Override如何检查方法名称的拼写错误。 (如果我理解正确的话)
我想覆盖这个方法:
public class Foo {
public void foo() { ... }
}
没有@Override
,我仍然可以覆盖它:
public class Bar extends Foo {
public void foo() { ... }
}
但如果我拼错了它:
public class Bar extends Foo {
public void fooo() { ... }
}
fooo
不会覆盖foo
。如果我没有意识到拼写错误,我不会知道foo
实际上没有被覆盖。这可能会导致错误。
如果我将@Override
添加到fooo
,但是:
public class Bar extends Foo {
@Override
public void fooo() { ... }
}
编译器会告诉我fooo
不会覆盖任何东西。我会看到这个消息然后去“但它确实覆盖了foo
!为什么编译器说它没有?哦等等!我拼错了它。”
你的理解是错误的。
第一:它是@Override
。 Java区分大小写,所以是的,区别很重要。其次:
我已经知道它会覆盖父方法。
不,它只是标志着它应用的方法的事实。只是因为你在方法上击败@Overrides
,并不会神奇地使它覆盖某些东西。如果没有,它将导致例外。
至于检查拼写错误:假设您要覆盖toString()
方法。
@Override
public String toString() {
return "myString";
}
将成功,因为toString确实存在于父类(Object)中。
但是,当你尝试:
@Override
public String toSttring() {
return "one t too many";
}
它将搜索父类和实现的接口。如果它无法在任何地方找到此方法签名,则会抛出异常。看来这最有可能应该是toString()
而不是toSttring()
,这是一个检查。
但是,它不会检查拼写。它基本上检查方法签名(包括方法名称)。
如果您尝试:
@Override
public Double toString() {
return new Double("5");
}
除非您自己在类的父类中添加了此方法,否则这将失败,因为Objects toString返回一个String。
就像:
@Override
public String toString(String value) {
return value;
}
由于同样的原因,很可能会失败。
编辑:只是为了澄清:@Override
不做拼写检查。如果您在父类中拼错了方法名称,如果在子类中正确拼写它并添加覆盖注释,它将不起作用。
答案很简单。
@Override注释指示编译器覆盖覆盖注释下面的方法被覆盖,即,具有匹配签名的方法应该出现在类的层次结构中的一个父类中,其中该方法在该类的层次结构中被写入。编写代码。
它会在编译器时间,层次结构(即父类,祖父类等)中检查您编写的当前方法是否具有相同签名的方法。如果不是,则会引发错误。这不是拼写检查。它是关于签名匹配,即参数的类型和顺序以及方法名称。
java @Override注释将确保方法签名中的任何超类更改都会导致警告,您必须进行必要的更改以确保类按预期工作。
在编译时解决潜在问题比运行时更好。因此,每当您尝试覆盖超类方法时,请始终使用java @Override注释。