Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的循环继承层次结构_Java_Inheritance - Fatal编程技术网

Java中的循环继承层次结构

Java中的循环继承层次结构,java,inheritance,Java,Inheritance,我知道Java中不允许使用以下循环继承层次结构。编译器抛出一个错误,但我真正感兴趣的是知道编译失败的确切原因 class A extends B{} class B extends C{} class C extends A{} // this will give you compile time error. 编译器将抛出错误的原因是什么?当我编写代码时,class C扩展了A{}我们可以将问题归结为这些语句,因为C是-AB: class A extends C{} class C ext

我知道Java中不允许使用以下循环继承层次结构。编译器抛出一个错误,但我真正感兴趣的是知道编译失败的确切原因

class A extends B{}
class B extends C{}
class C extends A{}  // this will give you compile time error.

编译器将抛出错误的原因是什么?当我编写代码时,
class C扩展了A{}

我们可以将问题归结为这些语句,因为
C
是-A
B

class A extends C{}
class C extends A{}

显然,这是一个冲突,因此编译器给出了错误。

这种关系根本不可能。它定义了一个无限递归类。为了定义
C类
,您需要
A类
,为了定义
A类
您需要
B类
,为了定义
B类
您需要
C类
,您回到了起点。这是无限的,所以编译器不能这样做,而且它也没有逻辑意义。

只要看看单词extends,在Java中,子类实际上扩展了它的超类。这意味着子对象是它的所有超级对象加上一些新成员和一些指定成员

那你怎么能

  • A是B的扩展
  • B是C的扩展
  • C是A的扩展 ?
我们可以说扩展是一个so:
A扩展了B意味着A(甚至不是A让我们把遗传的概念抽象出来到族谱中。本质上,这就是它们归结为什么。我将在这里使用反向映射方案,所以我将从C到A

  • 你从你母亲那里继承了某些属性
  • 你母亲继承了她父亲的某些品质
  • 你的祖父可以被认为是继承链中最高的
在Java中,这将导致:

  • C继承自B
  • B继承自A
  • A是继承链中的最高对象
从逻辑上讲,这包括一个Java不支持的特性,但可以通过使用来缓解


你的继承计划说的是祖父直接从孙子继承,这毫无意义。

有一个非常实际的问题(除了在其他答案中解释的逻辑问题外):

类必须在实例化期间初始化。这在Java中是通过首先初始化超类来完成的。当您有一个周期时,初始化代码会沿着继承阶梯上升,并尝试初始化从未到达的超类


因此,对于Java来说,这是必须禁止的。

循环继承可以有两个例子:
1.A类扩展A{}:-这没有任何意义,因为A类的成员已经存在于A类中,那么为什么要扩展。
2.类A扩展了B{},类B扩展了A{}:-在这种情况下,两个类的成员都可以写在一个类中,那么为什么要写两个类并互相扩展。

由于上述用例无效,因此Java不支持循环继承。

我想我会为这个线程添加一个尚未声明的Java特定答案。在Java中,每个类最终都必须派生自
对象
类。这就是为什么每个对象都可以毫无问题地转换为
对象
的实例。为支持这一事实,各国:

除了没有超类的Object,每个类都有一个且只有一个直接超类(单继承)。在没有任何其他显式超类的情况下,每个类都隐式地是Object的子类

类可以从派生自类等的类的类派生而来,并最终从最顶层的类Object派生而来。这样一个类可以说是继承链中延伸到Object的所有类的后代


如果允许循环继承依赖,并且因为Java中的类必须只有一个直接超类(见上文),那么任何循环依赖链中的类实例(例如,类的实例
A
B
,和
C
)无法从
对象
继承,这是不允许的。因此,这些循环依赖项对象都不能被视为
对象
s。因此,编译器必须禁止循环依赖项。

当狗是动物时,动物不是狗。否则所有动物都将是狗!!看到这个评论有多可笑吗???@Thihara While你是对的,这与问题没有直接关系。
A类扩展A{}
根据你的逻辑是可以的,尽管这个定义实际上与extremeGrandfatherSo
A类扩展A{}
是可以的吗?
is-A
不是这里的问题。