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