我在一个名为“PlaceParser”的类中有一个方法extends
“ModelParser”:
protected Place parseModel(JSONObject element) ...
Place是Model的子类。
是否应将@Override
注释添加到上面的代码中?由于该方法具有不同的返回类型,这仍然算作覆盖具有相同名称和参数的基类方法/返回类型是否改变了'签名'?
“ModelParser”方法看起来像“ModelT”也扩展了“Model”:
protected abstract ModelT parseModel(JSONObject element)
throws JSONException;
更新@Jon Skeet:
基类声明如下:
public abstract class ModelParser<ModelT extends Model> {
之前我没有看过类的<ModelT extends Model>
样式声明。
答案 0 :(得分:6)
是的,您应该添加@Override
,因为您仍在覆盖该方法。您使用返回类型的协方差这一事实并没有改变它。
特别是,如果其他代码的表达式为ModelParser
并调用parseModel(element)
,那么它们仍然会在 实现中以多态方式结束。将其与重载(例如,通过添加其他参数)进行比较,其中将调用ModelParser
中的原始实现。
答案 1 :(得分:3)
OVERLOADING Java和几种编程语言允许您为多个方法重用方法名称。在某些情况下,您可能希望在同一个类中编写几个方法,这些方法基本上使用不同的参数执行相同的工作。 当您编写代码来调用一个方法时,将根据您提供的参数或参数的类型选择适当的方法。 两个规则适用于重载方法:
OVERRIDING 在类层次结构中,当子类中的方法与超类中的方法具有相同的名称和类型签名时,子类中的方法将被覆盖超类中的方法。 派生类中的方法可以与基类的方法具有相同的名称。如果您有一个名为book的基类和名为book1和book2的派生类,并且如果在所有三个类中使用相同的方法,则执行最后一个派生类方法,尽管在所有以前的类中都有类似名称的方法。 Java中的概念称为Overriding。
答案 2 :(得分:3)
1)方法重载和重写之间的第一个也是最重要的区别是,在Java中方法重载的情况下,方法的签名会在方法覆盖的情况下发生变化,但它保持不变。
2)方法重载与Java重写之间的第二个主要区别是你可以在一个类中重载方法,但是只能在子类上重写。
3)您无法在Java中覆盖
static
,final
和private
方法,但您可以在Java中重载静态,最终或私有方法。4)Java中的重载方法通过静态绑定绑定,并且重写的方法受动态绑定的约束。
5)私有和最终方法也不能在Java中重写。