方法将不同的Return类型覆盖为void

时间:2013-04-14 06:10:11

标签: java methods override

让我们说我们有这个方法

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

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

public String eat(){}

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

6 个答案:

答案 0 :(得分:6)

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

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

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

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

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

3)覆盖方法不能降低被覆盖方法的可访问性,意味着如果原始方法或重写方法是公共的,则覆盖方法不能使其受到保护。

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

因此,调用子类的方法将始终运行重写的方法(首先找到它们)。

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

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

答案 5 :(得分:0)

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

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

两个具有相同参数号,相同类型,相同返回类型但一个在父类中而另一个在子类中的方法被称为重写方法。