我对Java继承感到困惑。正如我研究的那样,Java 不支持多重继承。使其完全不存在钻石继承问题。
但是,Java的每个类默认都继承Object类,如果我们扩展一个类,那么有两个继承类,第一个是Object,第二个是我们继承的类。据我所知,如果任何类继承两个或多个类,则称为多重继承。这表明java支持多重继承,因为它同时继承了两个类。
那为什么说java不支持多重继承,java有没有可能出现菱形问题呢?
我对Java继承感到困惑。正如我研究的那样,Java 不支持多重继承。使其完全不存在钻石继承问题。
但是,Java的每个类默认都继承Object类,如果我们扩展一个类,那么有两个继承类,第一个是Object,第二个是我们继承的类。据我所知,如果任何类继承两个或多个类,则称为多重继承。这表明java支持多重继承,因为它同时继承了两个类。
那为什么说java不支持多重继承,java有没有可能出现菱形问题呢?
由于所有类都 extend Object
,因此您要扩展的基类根据定义已经在 extends Object
。您的类不需要添加Object
自己,因为它已经存在于层次结构中。
这意味着,在您的层次结构中Object
仍然只存在一次作为根,所以没有“钻石”。
看到这个
OBJECT CLASS
|
|
CLASS A{} //Class A extends class Object
|
|
CLASS B{} //Class B extends class A
|
|
CLASS C{}//Class C extends class B
由于每个类都是从对象类继承的,因此当您从其他类继承时,情况并非如此。因此,对象类将成为所有其他继承类的超级类或根类。
所以有什么问题?
您误解了Class extending Object
in 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
问题。
但是,Java的每个类默认都继承Object类,如果我们扩展一个类,那么有两个继承类,第一个是Object,第二个是我们继承的类
这是部分正确的。
如果你明确地扩展一个类,那么它不会扩展Object
类。
如果你有课
class A
{
}
然后,编译器会将其更改为
class A extends Object
{
}
但是,如果你明确地扩展一个类,如下所示,
class A extends AnotherClass
{
}
编译器现在不会添加任何东西,因此没有多重继承。
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只支持多重继承的语法不支持多重继承的实现。
继承就像借方,接口就像贷方,但接口在服务器端编程等其他概念中具有其自身的重要性。
不完全是在 Java 中,您一次只能从 1 个不同的类继承。该不同的类可能继承自另一个类,但是您没有一个类继承自多个不同的类...
您扩展的类已经从 Object 扩展。当您从新类扩展时,您实际上停止直接从 Object 扩展,而是通过新的直接祖先继承它。
所以这不是你从两个不同的类扩展,而是你从一个本身已经从另一个类扩展的类扩展,即 Object 类。
从视觉上看,多重继承将是:
A Object
| |
C
但你描述的情况实际上是:
Object
|
A
|
C
你可以有很多ancestors
但只有一个父母。在这里,祖先的意思是Object class
作为父母的意思是你正在扩展的类。
通过指定要继承的类,您可以覆盖默认的扩展对象。因此,只有当您不指定要继承的类时,类才会扩展 Object。