我对java继承感到困惑。因为我研究过Java不支持多重继承。因此它根本没有钻石的继承问题。
但是,每个Java类都默认继承Object类,如果我们扩展一个类,那么有两个继承的类首先是Object,第二个是我们继承的类。据我所知,如果任何类继承了两个或更多个类,则称为多重继承。它表明java支持多重继承,因为它同时继承了两个类。
那么为什么它说java不支持多继承并且有没有可能在java中出现钻石问题?
答案 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通过接口支持多重继承,但这里解释不正确:
将属性从一个类对象获取到另一个类对象:
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。