2013-04-14 36 views
1

比方说,我们有这个方法方法覆盖作废

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

,并在延伸的动物具有这种方法

public String eat(){} 

这被认为是为方法覆盖另一个类?因为我听说,您可以使用方法返回类型不同覆盖提供它们具有相同的方法参数

+2

这是不可能的。 – Ankit

回答

5

只能更改返回类型以原返回类型的子类。

+0

奇怪,但'String'是Object的子类为什么这不正确? – ALZ

+0

OP没有在父方法中使用Object作为返回类型,但他宁愿使用'void' –

1

这不是正确的代码,因为这两种方法具有相同的名称应返回相同的值,只有参数可以是型动物 重写是一种在子类 重载用相同的参数相同的方法具有不同argumens

0

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

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

所以,叫上一个子类将永远运行重载方法的方法(他们发现的)。

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

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

6

这既不是重载,也不是重写!这是编译错误。

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

以下是规则方法覆盖在Java中必须遵循,而重写任何方法。 私有,静态和最终方法不能被覆盖。

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

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

3)重写方法不能减少重载方法的可访问性,意思是如果原方法或重写方法是公共的,而重写方法不能使其保护。

+0

请注意,我们可以将返回类型更改为@Timmy提到的原始返回类型的子类。 –

2

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

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

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