Java中的多重继承相关混淆

时间:2012-10-29 07:52:55

标签: java

我对java继承感到困惑。因为我研究过Java不支持多重继承。因此它根本没有钻石的继承问题。

但是,每个Java类都默认继承Object类,如果我们扩展一个类,那么有两个继承的类首先是Object,第二个是我们继承的类。据我所知,如果任何类继承了两个或更多个类,则称为多重继承。它表明java支持多重继承,因为它同时继承了两个类。

那么为什么它说java不支持多继承并且有没有可能在java中出现钻石问题?

9 个答案:

答案 0 :(得分:6)

由于所有类扩展Object,因此您扩展的基类已经扩展Object。您的类本身不需要添加Object,因为它已存在于层次结构中。

这意味着,Object仍然只在您的层次结构中存在一次作为根,所以没有“钻石”。

答案 1 :(得分:6)

见这个

                     OBJECT CLASS
                           |
                           |
                     CLASS A{} //Class A extends class Object
                           |
                           |
                     CLASS B{} //Class B extends class A
                           |
                           |
                     CLASS C{}//Class C extends class B

由于每个Class都是从Object类继承的,因此当你从其他类继承时,它就不会出现。因此,对象类将成为所有其他继承类的超类或根类。

那么问题是什么?

答案 2 :(得分:5)

Class extending Object的情况下,您误解了Inheritance的概念。

只有继承层次结构中的顶级类从Object类扩展,并且层次结构中其他类更低,扩展了直接超类。因此,他们通过此Object层次结构拥有inheritance类的所有方法,并且没有涉及multiple inheritance

public class A {  // Extends from `Object` class
}

class B extends A { // Extends from `A`
}

class C extends B { // Extends from `B`
}

因此,层次结构中不会出现diamond问题。

答案 3 :(得分:5)

  

但是,每个Java类都默认继承Object类,如果我们扩展一个类,那么有两个继承的类首先是Object,第二个是我们继承的类

这是部分正确的。

如果你明确地扩展一个类,那么它将不会扩展Object类。

如果你有一个班级

class A
{

}

然后,编译器会将其更改为

class A extends Object
{

}

但是,如果你明确地扩展一个类,如下所示,

class A extends AnotherClass
{

}

编译器现在不会添加任何内容,因此没有多重继承。

答案 4 :(得分:4)

Java supports only syntactical multiple inheritance. Java does not 
supports  implementation of multiple inheritance.

有些人说java通过接口支持多重继承,但这里解释不正确:

inheritance ::

将属性从一个类对象获取到另一个类对象:

Class A{}

Class B extends A {}

这里是B类获取属性的对象(方法/函数/&数据成员/类变量) A级。

为什么java不支持使用类进行多重继承:

Class A{}
Class B{}
Class C extends A,B{}

X - 此语句导致错误,因为A类从A和B两侧获取对象类的对象...

默认情况下,每个java类扩展对象类的Object和对象类的Object是根对象,意味着所有类的超类。

但是这里C类有两个超类对象,所以给出错误意味着java不支持使用类进行多重继承。

java是否支持使用Interfaces进行多重继承:

由于这个接口概念,我们中只有少数人说java支持多重继承,但这是错误的。

这里的解释::

interface A{}
interface B{}
interface C implements A , B{}

(或)

interface A{}
interface B{}

Class C implements A , B{}

这看起来像多继承,但继承意味着将属性从一个类对象获取到另一个类对象。

在接口概念中,我们根本没有得到任何属性,而是在类中实现未实现的接口方法。

所以继承和接口完全相反.......

所以最后java只支持多重继承的语法,不支持多重继承的实现。

继承就像借记,界面就像信用,但界面在服务器端编程等其他概念中有其自身的重要性。

答案 5 :(得分:1)

不完全是Java,您一次只能从1个不同的类继承。那个不同的类可能从另一个类继承,但是你没有一个继承自多个不同类的类......

答案 6 :(得分:1)

您扩展的类已经从Object扩展。当您从新类扩展时,实际上是停止从Object直接扩展 ,而是通过新的直接祖先继承它。

所以并不是你从两个不同的类扩展,而是你从一个本身已经从另一个类扩展的类扩展,即Object类。

从视觉上看,多重继承将是:

  A  Object
  |   |
    C

但你描述的情况实际上是:

Object
  |
  A
  |
  C

答案 7 :(得分:1)

您可以拥有多个ancestors,但只有一个父级。这里的祖先意味着Object class,其中父母意味着你要扩展的阶级。

答案 8 :(得分:1)

通过指定要继承的类,可以覆盖默认的extends Object。因此,只有在未指定要继承的类时,类才会扩展Object。