Java 如果子类中的实例方法具有相同的签名和不同的返回类型,那么它是重写方法还是新方法?

Java 如果子类中的实例方法具有相同的签名和不同的返回类型,那么它是重写方法还是新方法?,java,inheritance,subclass,superclass,Java,Inheritance,Subclass,Superclass,我是Java新手,我正在尝试学习作为继承一部分的“重写方法”的概念 如果子类中的实例方法与超类中的方法具有相同的签名(即名称加上其参数的编号和类型),但返回类型不同,那么实例方法是否仍然覆盖超类中的方法?还是一种全新的方法 只有当重写方法的返回类型是被重写方法返回的类型的子类型时,它才是重写。如果您有不同的返回类型,则它是一个全新的方法。没有被推翻 返回类型也是方法签名的一部分。你需要遵守所有的规则来推翻它 这里要注意的有趣部分是协方差 假设您有父对象和子对象关系,并且试图在子对象中重写父对象的

我是Java新手,我正在尝试学习作为继承一部分的“重写方法”的概念


如果子类中的实例方法与超类中的方法具有相同的签名(即名称加上其参数的编号和类型),但返回类型不同,那么实例方法是否仍然覆盖超类中的方法?还是一种全新的方法

只有当重写方法的返回类型是被重写方法返回的类型的子类型时,它才是重写。

如果您有不同的返回类型,则它是一个全新的方法。没有被推翻

返回类型也是方法签名的一部分。你需要遵守所有的规则来推翻它

这里要注意的有趣部分是协方差

假设您有父对象和子对象关系,并且试图在子对象中重写父对象的方法,协方差意味着重写方法返回更具体的类型。下面的示例显示了返回对象的相同父方法,其中子方法决定返回一个特定类型(字符串),其中字符串是对象类的子对象。因此这里存在协方差

协变返回类型:


如果您感兴趣,请阅读我的博文:

重写方法具有与其重写的方法相同的名称、参数数量和类型,以及返回类型。重写方法还可以返回重写方法返回的类型的子类型。此子类型称为。 让我们举个例子:

子类方法的返回类型R2可能不同于超类方法的返回类型R1,但R2应该是R1的子类型。i、 例如,子类可以返回类型可以是超类返回类型的子类型


对于返回类型与具有相同参数arity和类型的同一命名父方法不同的方法,如果返回类型是父方法返回类型的子类型,则它是合法重写。如果不是,则是编译器错误

public interface Exemplary
{
  CharSequence getText();
}

public class Example implements Exemplary
{
  @Override
  public String getText(); // legal
}

public class BadExample implements Exemplary
{
  @Override
  public Integer getText(); // error
}

非常感谢您的帮助!还有一个问题,如果返回类型不是被重写方法返回的类型的子类型,那么它是一个新方法?@dzjustinli在这种情况下它不会编译,因为编译器会将它视为另一个方法(重载),但由于返回类型不能重载方法,因此它不会编译。非常感谢您的帮助!接下来的问题是,如果返回类型不是被重写方法返回的类型的子类型,那么它是一个新方法?@dzjustinli否。如果只有返回类型不兼容,则会出现编译器错误。如果你给它添加了几个参数,这被认为是一个新方法(重载)。如果它们的返回值与它们的对象相同,那么它是否被覆盖???不要忘记'@Override'注释!是的,他补充道。如果您没有添加,即使它只是默认的覆盖。
    class ShapeFactory {
        public Shape newShape() {}
   }

   class CircleFactory extends ShapeFactory {
        @Override
        public Circle newShape() {}
   } 
public interface Exemplary
{
  CharSequence getText();
}

public class Example implements Exemplary
{
  @Override
  public String getText(); // legal
}

public class BadExample implements Exemplary
{
  @Override
  public Integer getText(); // error
}