Java:重写还是重载方法?

Java:重写还是重载方法?,java,inheritance,annotations,overloading,overriding,Java,Inheritance,Annotations,Overloading,Overriding,我在一个名为“PlaceParser”的类中有一个方法,它扩展了“ModelParser”: 地点是模型的一个子类。 是否应将@Override注释添加到上述代码中?由于该方法具有不同的返回类型,这是否仍算作覆盖具有相同名称和参数的基类方法/返回类型是否更改“签名” “ModelParser”方法看起来像“ModelT”也扩展了“Model”: 更新@Jon Skeet: 基类声明如下: public abstract class ModelParser<ModelT extends M

我在一个名为“PlaceParser”的类中有一个方法,它扩展了“ModelParser”:

地点是模型的一个子类。 是否应将
@Override
注释添加到上述代码中?由于该方法具有不同的返回类型,这是否仍算作覆盖具有相同名称和参数的基类方法/返回类型是否更改“签名”

“ModelParser”方法看起来像“ModelT”也扩展了“Model”:


更新@Jon Skeet:

基类声明如下:

public abstract class ModelParser<ModelT extends Model> {
公共抽象类模型解析器{

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

是的,您应该添加
@Override
,因为您仍然在重写该方法。使用返回类型的协方差这一事实不会改变这一点


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

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

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

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

    2) Java中方法重载和重写的第二个主要区别是,您可以在一个类中重载方法,但重写只能在子类上完成

    3) 您不能在Java中重写
    static
    final
    private
    方法,但可以在Java中重载static、final或private方法

    4) Java中的重载方法由静态绑定绑定,重写的方法受动态绑定约束

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


    阅读更多内容:

    请参阅。(不完全是您的情况,因为
    Place
    不扩展
    ModelT
    )@Eli:我怀疑Place实际上扩展了ModelT,否则此代码将无法编译。(或者ModelT是泛型类型参数…)@乔恩:我已经更新了这个问题-如果你能解释一下
    ModelT
    Place
    之间的关系,我将非常感激。有没有可能
    PlaceParser扩展了ModelParser
    呢?如果是的话,那么实际上
    ModelT
    就是
    Place
    在这里……在这种情况下,你甚至不会真正改变返回类型。@乔恩:是的,这对我现在来说很有意义。谢谢你帮助我理解它。:)
    protected abstract ModelT parseModel(JSONObject element)
                throws JSONException;
    
    public abstract class ModelParser<ModelT extends Model> {