Java:覆盖或重载方法?

我在一个名为“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 { 

我之前没有看到过类的样式声明。

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

特别是,如果其他代码具有ModelParser类型的ModelParser并调用parseModel(element)它们仍将在您的实现中以多态方式结束。 将其与重载 (例如,通过添加另一个参数)进行比较,其中将调用ModelParser中的原始实现。

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

  1. 方法的返回类型可以不同,但​​重载方法的参数列表必须不同。
  2. 调用语句的参数列表必须足够不同,以允许明确确定正确的调用方法。

OVERRIDING在类层次结构中,当子类中的方法与超类中的方法具有相同的名称和类型签名时,子类中的方法将被覆盖超类中的方法。 派生类中的方法可以与基类的方法具有相同的名称。 如果您有一个名为book的基类和名为book1和book2的派生类,并且如果在所有这三个类中使用相同的方法,则执行最后一个派生类方法,尽管在所有以前的类中都有类似名称的方法。 Java中的概念称为Overriding。

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

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

3)您不能在Java中覆盖static,final和private方法,但可以在Java中重载static,final或private方法。

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

5)私有和最终方法也可以不在Java中重写。 在此处输入图像描述

阅读更多: http : //javarevisited.blogspot.com/2011/12/method-overloading-vs-method-overriding.html#ixzz3TbRYYM5z