2

我对Java继承感到困惑。正如我研究的那样,Java 不支持多重继承。使其完全不存在钻石继承问题。

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

那为什么说java不支持多重继承,java有没有可能出现菱形问题呢?

4

9 回答 9

6

由于所有类都 extend Object,因此您要扩展的基类根据定义已经在 extends Object。您的类不需要添加Object自己,因为它已经存在于层次结构中。

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

于 2012-10-29T07:55:13.180 回答
6

看到这个

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

由于每个类都是从对象类继承的,因此当您从其他类继承时,情况并非如此。因此,对象类将成为所有其他继承类的超级类或根类。

所以有什么问题?

于 2012-12-15T06:46:18.560 回答
5

您误解了Class extending Objectin case of的概念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问题。

于 2012-10-29T07:57:48.267 回答
5

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

这是部分正确的。

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

如果你有课

class A
{

}

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

class A extends Object
{

}

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

class A extends AnotherClass
{

}

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

于 2012-10-29T08:01:45.907 回答
4
Java supports only syntactical multiple inheritance. Java does not 
supports  implementation of multiple inheritance.

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

继承 ::

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

Class A{}

Class B extends A {}

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

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

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

X--该语句导致错误,因为A类从A和B双方获取对象类的对象...

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

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

java是否支持使用接口的多重继承:

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

这里的解释::

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

(或者)

interface A{}
interface B{}

Class C implements A , B{}

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

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

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

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

继承就像借方,接口就像贷方,但接口在服务器端编程等其他概念中具有其自身的重要性。

于 2012-12-14T11:45:55.193 回答
1

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

于 2012-10-29T07:57:51.660 回答
1

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

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

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

  A  Object
  |   |
    C

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

Object
  |
  A
  |
  C
于 2012-10-29T07:58:33.127 回答
1

你可以有很多ancestors但只有一个父母。在这里,祖先的意思是Object class作为父母的意思是你正在扩展的类。

于 2012-10-29T07:59:13.040 回答
1

通过指定要继承的类,您可以覆盖默认的扩展对象。因此,只有当您不指定要继承的类时,类才会扩展 Object。

于 2012-10-29T08:00:38.163 回答