我理解语言规范只声明单一继承,但我对这个似乎如何打破规则感到困惑。
如果我写一个Exception
课程,我会写:
public class MyException extends Exception {
//class body
}
只有look here,您才会注意到课程Exception
延伸Throwable
。
所以在我看来,我们有(理论代码示例)
public class MyException extends Throwable, Exception {
//class body
}
为什么不呢?
我认为这是以每个类扩展Object
的方式完成的,但也可以被子类化一次?
答案 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
同时属于Throwable
和Exception
,但仍然如此。有关多继承带来什么的解释here:
“在具有多重继承的面向对象编程语言中,钻石问题(有时被称为”死亡的致命钻石“1)是一种模糊性,当两个类B和C继承自A时,并且D类继承自B和C.如果D调用A中定义的方法(并且不覆盖该方法),并且B和C以不同方式覆盖该方法,那么它从哪个类继承:B或C? “
答案 4 :(得分:0)
一个类可以扩展一个可以扩展另一个类的类。但是一个类不能继承两个类。这会导致歧义。这就是为什么java 不支持多重继承。
MyException扩展Exception,它扩展了Throwable。这是继承链。它不会引起歧义。