Java单一继承和异常/可抛出类

时间:2012-07-06 16:40:29

标签: java inheritance

我理解语言规范只声明单一继承,但我对这个似乎如何打破规则感到困惑。

如果我写一个Exception课程,我会写:

public class MyException extends Exception {
    //class body
}

只有look here,您才会注意到课程Exception延伸Throwable

所以在我看来,我们有(理论代码示例)

 public class MyException extends Throwable, Exception {
    //class body
 }

为什么呢?

我认为这是以每个类扩展Object的方式完成的,但也可以被子类化一次?

5 个答案:

答案 0 :(得分:5)

层次结构中可以有多个级别。类可以扩展一个本身扩展另一个类(或实现接口)的类。这与理论上或实践中的一个类本身延伸两个类不同。

Java中的接口确实提供了与其他语言中的多重继承相同的功能(因为类可以实现多个接口),但这不是您在此处看到的。这是具有多个祖先类的标准单继承。

这可能有助于描绘一个(生物学上很奇怪的)家谱,其中每个孩子只有一个父母。那些孩子也可能有祖父母,但在结构的任何层面上都不得超过一个节点。

你想象的结构看起来像这样:

A   B
 \ /
  C

但它实际上是这样的:

A
|
B
|
C

最明显的区别是,A的更改不会影响第一个图表中B的实例,但会影响第二个图片中的B

答案 1 :(得分:0)

  

我认为这与每个类扩展Object的方式相同   但也可以一次子类化?

不完全。想一想:

class A { }

可以被认为是

class A extends Object { }

但是

class A extends B { }

应该是as

class B extends Object { }
class A extends B { }

而不是

class A extends B, Object { }

在类继承层次结构中(不计算接口的实现),每个类可以有一个父类,除了树的根的Object

答案 2 :(得分:0)

这是一个继承链

对象 - >可扔 - >例外 - > MyException

请参阅此处http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

答案 3 :(得分:0)

因此,在您的示例中MyException除了Throwable之外还是Exception。因此,层次结构如下:

Throwable -> Exception -> MyException

因此,我们可以说层次结构实际上是这样的:

Throwable -> MyException  
Exception -> MyException

虽然MyException同时属于ThrowableException,但仍然如此。有关多继承带来什么的解释here

“在具有多重继承的面向对象编程语言中,钻石问题(有时被称为”死亡的致命钻石“1)是一种模糊性,当两个类B和C继承自A时,并且D类继承自B和C.如果D调用A中定义的方法(并且不覆盖该方法),并且B和C以不同方式覆盖该方法,那么它从哪个类继承:B或C? “

答案 4 :(得分:0)

一个类可以扩展一个可以扩展另一个类的类。但是一个类不能继承两个类。这会导致歧义。这就是为什么java 不支持多重继承

MyException扩展Exception,它扩展了Throwable。这是继承链。它不会引起歧义。