2

假设我们有这个方法

 public class Animal {
     public void eat() { }
}

在另一个扩展 Animal 的类上有这个方法

public String eat(){}

这被认为是方法覆盖吗?因为我听说你可以在方法覆盖中使用不同的返回类型,只要它们具有相同的方法参数

4

6 回答 6

6

这既不是重载,也不是压倒一切!这是编译错误。

在 Java 中,可以在同一个类中定义两个或多个同名的方法,只要它们的参数声明不同。在这种情况下,方法被称为重载,过程被称为方法重载。

以下是 java 中方法覆盖的规则,在覆盖任何方法时必须遵循这些规则。私有、静态和最终方法不能被覆盖。

1)方法签名必须相同,包括返回类型、方法参数个数、参数类型和参数顺序。

2)重写方法不能抛出比原始方法或重写方法更高的异常。此规则仅适用于 Java 中的已检查异常,被覆盖的方法可以随意抛出任何未检查的异常。

3)重写方法不能减少重写方法的可访问性,这意味着如果原始或重写方法是公共的,而不是重写方法不能使其受到保护。

于 2013-04-14T07:07:36.180 回答
5

您只能将返回类型更改为原始返回类型的子类。

于 2013-04-14T06:12:51.627 回答
3

从技术角度来看,所有答案都是正确的,因为 Void 是 Java 中没有其他类可以扩展的类,并且当方法被覆盖时,返回类型必须是原始类型的子类型(parentReturnType.isAsignableFrom(overriddenReturnType) )。

但从实际的角度来看,这个问题仍然有效,为特殊情况无效找借口是有道理的。Void 类型的变量可以保存的唯一值是 null。此外,没有变量可以具有原始类型 void。最后你不能编译这段代码: Void result = object.notify(); 因此,最终在引入 1.5 时以不同方式指定 Java 并允许用任何其他类型覆盖 void 返回类型是有意义的。

因此,唯一合理的答案是恕我直言,这是不可能的,因为 Java 的设计不允许这样做。

于 2014-02-28T22:18:12.903 回答
1

这不正确的代码,因为两个具有相同名称的方法应该返回相同的值,只有参数可以不同 覆盖是在子类中具有相同的方法和相同的参数 重载具有相同的方法名称和不同的参数

于 2013-04-14T06:28:59.170 回答
0

方法的返回类型不是该方法签名的一部分。

当您调用eat()子类时,java 查看您提供的签名(eat不带参数)并开始寻找具有此签名的方法,从您调用它的对象的实例类型的类开始(并搜索其祖先如果找不到它)。

因此,在子类上调用的方法将始终运行被覆盖的方法(首先找到它们)。

OO(特别是多态性)的一个关键“点”是可以在预期超类的地方传递子类。如果一个方法想要调用超类的eat()方法并获得一个 void,但您将一个子类传递给该方法,该方法eat()返回一个字符串;你可以看到这个方法会调用子类的eat并得到一个意想不到的值。
您可以看到为什么这可能是一个问题。:我

因此,重写方法必须返回相同的类型或父类返回的类型的子类。(类似的原则适用于为什么你可以返回一个子类;我会让你考虑一下 c:)

于 2013-04-14T06:58:34.853 回答
0

它既不是覆盖也不是重载,它会产生编译错误。

具有相同名称,不同参数编号或不同类型参数的两个方法称为重载方法,返回类型可能相同或不同。它可能在同一个班级或父、子班级。

具有相同参数编号、相同类型、相同返回类型但一个在父类中而另一个在子类中的两个方法称为覆盖方法。

于 2020-02-06T12:48:04.873 回答