Java:覆盖或重载方法?

时间:2011-06-29 15:37:57

标签: java inheritance annotations overloading override

我在一个名为“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>样式声明。

3 个答案:

答案 0 :(得分:6)

是的,您应该添加@Override,因为您仍在覆盖该方法。您使用返回类型的协方差这一事实并没有改变它。

特别是,如果其他代码的表达式为ModelParser并调用parseModel(element),那么它们仍然会在 实现中以多态方式结束。将其与重载(例如,通过添加其他参数)进行比较,其中将调用ModelParser中的原始实现。

答案 1 :(得分:3)

OVERLOADING Java和几种编程语言允许您为多个方法重用方法名称。在某些情况下,您可能希望在同一个类中编写几个方法,这些方法基本上使用不同的参数执行相同的工作。 当您编写代码来调用一个方法时,将根据您提供的参数或参数的类型选择适当的方法。 两个规则适用于重载方法:

  1. 方法的返回类型可以不同,但​​重载方法的参数列表必须不同。
  2. 调用语句的参数列表必须足够不同,以便明确确定要调用的正确方法。
  3. OVERRIDING 在类层次结构中,当子类中的方法与超类中的方法具有相同的名称和类型签名时,子类中的方法将被覆盖超类中的方法。 派生类中的方法可以与基类的方法具有相同的名称。如果您有一个名为book的基类和名为book1和book2的派生类,并且如果在所有三个类中使用相同的方法,则执行最后一个派生类方法,尽管在所有以前的类中都有类似名称的方法。 Java中的概念称为Overriding。

答案 2 :(得分:3)

  

1)方法重载和重写之间的第一个也是最重要的区别是,在Java中方法重载的情况下,方法的签名会在方法覆盖的情况下发生变化,但它保持不变。

     

2)方法重载与Java重写之间的第二个主要区别是你可以在一个类中重载方法,但是只能在子类上重写。

     

3)您无法在Java中覆盖staticfinalprivate方法,但您可以在Java中重载静态,最终或私有方法。

     

4)Java中的重载方法通过静态绑定绑定,并且重写的方法受动态绑定的约束。

     

5)私有和最终方法也不能在Java中重写。

     

enter image description here

了解详情:https://javarevisited.blogspot.com/2011/12/method-overloading-vs-method-overriding.html#ixzz3TbRYYM5z