20

我知道一个类可以实现多个接口,但是可以扩展多个类吗?例如,我希望我的课程同时扩展TransformGroup我创建的课程。这在Java中可能吗?两个语句都class X extends TransformGroup extends Y收到class X extends TransformGroup, Y一个错误。如果不可能,为什么?TransformGroup扩展Group,但我猜它也扩展Node了,因为它继承了字段,Node并且可以在需要Node对象的地方传递。此外,像 Java 中的所有类一样,它们扩展Object类。那么为什么不能扩展一个以上的类呢?

TransformGroup 继承

那么,如果这是可能的,那么正确的方法是什么?如果不是,为什么以及如何解决问题?

4

11 回答 11

51

在 Java 中不允许多重继承。作为设计决策,它被排除在语言之外,主要是为了避免循环依赖。

场景 1:正如您所了解的,在 Java 中不可能进行以下操作:

public class Dog extends Animal, Canine{

}

场景 2:但是以下情况是可能的:

public class Canine extends Animal{

}

public class Dog extends Canine{

}

这两种方法的区别在于,第二种方法有一个明确定义的父类或super类,而第一种方法中的super类是模棱两可的。

考虑是否两者Animal都有Canine一个方法drink()。在第一种情况下,如果我们调用哪个父方法会被调用Dog.drink()?在第二种情况下,我们知道只要没有覆盖类方法,调用Dog.drink()就会调用它。CaninedrinkDog

于 2013-02-28T10:00:28.550 回答
4

不,这在 java 中是不可能的(也许在 java 8 中它会可用)。除了在树中延伸的情况。例如:

class A
class B extends A
class C extends B
于 2013-02-28T10:02:57.643 回答
4

在 Java 中,仅针对接口的实现(类)不允许多重继承:

interface A extends B, C

例如MouseInputListener扩展了 MouseListener 和 MouseMotionListener

当然,一个类可以实现多个接口:

class X implements A, F
于 2013-02-28T10:14:09.683 回答
3

类不能实现多重继承,可以通过接口实现,但类不行。它是由java语言设计的。看看 James gosling 的评论。

James Gosling 在 1995 年 2 月给出了一个关于为什么 Java 不支持多重继承的想法。

JAVA 省略了 C++ 中许多很少使用、难以理解、令人困惑的特性,根据我们的经验,这些特性带来的痛苦多于好处。这主要包括运算符重载(尽管它确实有方法重载)、多重继承和广泛的自动强制。

于 2013-02-28T10:06:06.573 回答
3

Java中没有多重继承的概念。只能实现多个接口。

于 2013-02-28T10:01:13.160 回答
3

多重继承

假设 B 和 C 正在覆盖继承的方法和它们自己的实现。现在 D 使用多重继承同时继承了 B 和 C。D 应该继承被覆盖的方法。问题是将使用哪个被覆盖的方法?它来自B还是C?这里我们有一个歧义。为了排除这种情况,Java 中没有使用多重继承。

于 2016-01-05T18:30:28.923 回答
2

java不能支持多重继承,但是你可以这样做

class X
{
}
class Y extends X
{
}
class Z extends Y{
}
于 2013-02-28T10:06:03.253 回答
2

Java 没有提供多重继承。
当您说 A 扩展 B 时,这意味着 A 扩展 B 并且 B 扩展 Object。
这并不意味着 A 扩展 B、Object。

class A extends Object
class B extends A

于 2013-02-28T10:03:53.830 回答
1

给出的大多数答案似乎都假设我们希望继承的所有类都是由我们定义的。

但是,如果我们没有定义其中一个类,即我们无法更改其中一个类继承自什么,因此无法使用已接受的答案,那么会发生什么?

那么答案取决于我们是否至少定义了一个类。A即在我们想要继承的类列表中存在一个类,它A是由我们创建的。

除了已经接受的答案之外,我还提出了这个多重继承问题的另外 3 个实例以及每个实例的可能解决方案。

继承类型 1

好吧,假设您想要一个类C来扩展类,A并且B,哪里B是在其他地方定义的类,但A由我们定义。我们可以做的就是把它A变成一个接口,然后类C可以A在扩展的同时实现B

class A {}
class B {} // Some external class
class C {}

变成

interface A {}
class AImpl implements A {}
class B {} // Some external class
class C extends B implements A

继承类型 2

现在假设你有两个以上的类要继承,同样的想法仍然成立——除了一个类之外的所有类都必须由我们定义。因此,假设我们希望类A从以下类继承,B, C, ...X其中X是我们外部的类,即在其他地方定义的类。我们应用相同的想法将所有其他类,但最后一个类转换为接口,然后我们可以拥有:

interface B {}
class BImpl implements B {}
interface C {}
class CImpl implements C {}
...
class X {}
class A extends X implements B, C, ...

继承类型 3

最后,还有一种情况是你只有一堆类要继承,但它们都不是你定义的。这有点棘手,但可以通过使用委托来实现。委托允许一个类A伪装成其他类,但是对定义在 中的一些公共方法的B任何调用,实际上都是将该调用委托给一个类型的对象并返回结果。这使得课堂成为我所说的ABBAFat class

这有什么帮助?

嗯,这很简单。您创建一个接口,指定您想要使用的外部类中的公共方法,以及您正在创建的新类中的方法,然后您让新类实现该接口。这听起来可能令人困惑,所以让我更好地解释一下。

最初我们有以下外部类B, C, D, ..., X,我们希望我们的新类A继承自所有这些类。

class B {
    public void foo() {}
}

class C {
    public void bar() {}
}

class D {
    public void fooFoo() {}
}

...

class X {
    public String fooBar() {}
}

接下来我们创建一个接口,该接口A公开之前在类 A 中的公共方法以及来自上述类的公共方法

interface A {
    void doSomething(); // previously defined in A
    String fooBar(); // from class X
    void fooFoo(); // from class D
    void bar(); // from class C
    void foo(); // from class B
}

最后,我们创建一个AImpl实现接口的类A

class AImpl implements A {
    // It needs instances of the other classes, so those should be
    // part of the constructor
    public AImpl(B b, C c, D d, X x) {}
    ... // define the methods within the interface
}

你有它!这是一种伪继承,因为类型的对象A不是我们开始使用的任何外部类的严格后代,而是公开了一个接口,该接口定义了与这些类中相同的方法。

你可能会问,为什么我们不只是创建一个定义我们想要使用的方法的类,而不是定义一个接口。即为什么我们没有一个A包含我们想要继承的类的公共方法的类?这样做是为了减少耦合。我们不希望类过去A必须过多地依赖于类A(因为类往往会发生很多变化),而是要依赖于接口中给出的承诺A

于 2017-04-11T06:37:14.100 回答
0

Java does not allow extending multiple classes.

Let's assume C class is extending A and B classes. Then if suppose A and B classes have method with same name(Ex: method1()). Consider the code:

C obj1 = new C(); obj1.method1(); - here JVM will not understand to which method it need to access. Because both A and B classes have this method. So we are putting JVM in dilemma, so that is the reason why multiple inheritance is removed from Java. And as said implementing multiple classes will resolve this issue.

Hope this has helped.

于 2013-10-19T05:53:01.693 回答
-1

您好请注意像真正的工作。

孩子不能有两个妈妈

所以在java中,子类不能有两个父类。

于 2016-10-26T07:00:40.773 回答