1

我知道语言规范只声明了单一继承,但我对这个例子似乎违反了规则感到困惑。

如果我写一个Exception类,我会写:

public class MyException extends Exception {
    //class body
}

只是,如果你看这里,你会注意到类Exceptionextends Throwable

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

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

为什么不是这样?

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

4

5 回答 5

5

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

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

描绘一个(生物学上奇怪的)家谱可能会有所帮助,其中每个孩子都有一个父母。这些孩子也可能有一个祖父母,但在结构的任何级别上都不会超过一个节点。

您正在想象一个看起来像这样的结构:

A   B
 \ /
  C

但实际上是这样的:

A
|
B
|
C

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

于 2012-07-06T16:42:45.297 回答
0

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

不完全的。这样想:

class A { }

可以认为是

class A extends Object { }

class A extends B { }

应该是

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

并不是

class A extends B, Object { }

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

于 2012-07-06T16:46:09.010 回答
0

这是一个继承链

对象 -> Throwable -> 异常 -> MyException

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

于 2012-07-06T16:46:53.127 回答
0

因此,在您的示例MyExceptionThrowable,除了是Exception. 因此层次结构是这样的:

Throwable -> Exception -> MyException

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

Throwable -> MyException  
Exception -> MyException

虽然仍然MyException是 aThrowable和 an Exception。有关多重继承带来的解释,请看这里

“在具有多重继承的面向对象编程语言中,菱形问题(有时称为“致命的死亡菱形” 1)是当两个类 B 和 C 继承自 A,而类 D 继承自两个 B 时出现的歧义和 C。如果 D 调用在 A 中定义的方法(并且没有覆盖该方法),并且 B 和 C 以不同方式覆盖了该方法,那么它从哪个类继承:B 还是 C?

于 2012-07-06T16:50:04.690 回答
0

一个类可以扩展一个可以扩展另一个类的类。但是一个类不能继承两个类。会造成歧义。这就是java不支持多重继承的原因。

MyException 扩展 Exception 扩展 Throwable。那就是继承链。它不会引起歧义。

于 2012-07-06T16:52:02.593 回答