2013-03-08 126 views
1

有没有人知道为什么重写过程重写的方法必须抛出重写的方法的同一类型(或子类型)的异常,而另一方面,对于构造函数它的工作方式相反(因此,必须抛出同样的异常或超扔什么的超类型。 非常感谢提前。异常构造函数与异常Java

+0

这是不正确的。所以这个问题没有意义。子类构造函数不会覆盖其超类构造函数。它称之为。 – 2013-03-08 17:04:29

回答

4

构造函数没有覆盖他们的父类的构造函数,但他们呼叫超类的构造函数,或隐或显。因此,就像调用其他方法抛出一个Exception的方法一样,构造函数必须捕获超类的构造函数抛出的异常, st声明它会抛出相同的异常(或该异常的超类)。

另一方面,重写方法必须坚持超类的方法定义。因此,它可以抛出一个更具体的例外,或根本没有。但它不能抛出更广泛的例外,因为这会违反超类的合同。

0

我相信对子类构造函数没有这样的限制。他们可以抛出他们关心的任何类型的异常,与超类构造函数抛出的类型无关。显然,如果他们让超类构造函数通过一个异常,他们将不得不声明它或它的超类型,就像使用其他方法一样。但是,这不是对子类构造函数的具体限制:通过抛出其他类型,您可以轻松地捕获并处理异常。

原因是为什么子类中的构造函数没有“重写”超类中的构造函数,并且没有以方式多态使用。这是一个独立的事物,就像一个名为Subclass.B()的函数独立于Superclass.A()

还有你总是知道当你打电话给new Subclass()时,你就调用了这个构造函数。而如果你有一个Superclass的参考,并且打电话给superclass.overriddenMethod(),你不能确定这个类型是什么。因此,覆盖该方法的任何子类都不能抛出除超类上声明的异常以外的任何其他异常,它们可能会更改方法签名的其余部分。

0

在构造函数中总是会有一个(可能是隐含的)超级调用。 抛出一个超类Exception也会捕获这个。

public B() { 
    ... initialize fields declared with X x = ...; 
    ... call super constructor 
    ... body of constructor 
} 

一个最重要的方法但是可以更具体,也为例外:降低的可能性。