类扩展多个Java类?

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

TransformGroupinheritance

那么,如果可能的话,做到这一点的正确方法是什么? 如果没有,为什么以及如何解决问题呢?

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

场景1:如您所知,Java中无法实现以下function:

 public class Dog extends Animal, Canine{ } 

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

 public class Canine extends Animal{ } public class Dog extends Canine{ } 

这两种方法的不同之处在于,在第二种方法中,有一个明确定义的父类或super类,而在第一种方法中, super类是模糊的。

考虑AnimalCanine是否都有方法drink() 。 在第一个场景中,如果我们调用Dog.drink()将调用父方法? 在第二种情况下,我们知道只要Dog没有覆盖它,调用Dog.drink()就会调用Caninedrink方法。

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

 class A class B extends A class C extends B 

在Java中,不允许对接口的实现(类)进行多重inheritance:

 interface A extends B, C 

例如, MouseInputListener扩展了MouseListener和MouseMotionListener

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

 class X implements A, F 

类无法实现多重inheritance,您可以在界面的帮助下实现它,而不是使用类。 它是由java语言设计的。 看看James Gosling的评论。

作者:James Gosling在1995年2月给出了为什么Java中不支持多inheritance的想法。

JAVA省略了许多很少使用,知之甚少,令人困惑的C ++特性,这些特性在我们的经验中带来了比利益更多的悲伤。 这主要包括运算符重载(尽管它确实有方法重载),多重inheritance和广泛的自动强制。

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

多重inheritancehttp://bit.ly/1Z62XjI

假设B和C重写了inheritance的方法和它们自己的实现。 现在D使用多重inheritanceinheritanceB&C。 D应该inheritance被覆盖的方法。问题是将使用哪个重写方法? 它会来自B还是C? 在这里,我们有一个模棱两可。 为了排除这种情况,Java中没有使用多重inheritance。

Java没有提供多重inheritance。
当你说A扩展B时,它意味着A扩展B而B扩展了Object。
它并不意味着A扩展B,对象。

class A extends Object
class B extends A

java不能支持多重inheritance。但是你可以这样做

 class X { } class Y extends X { } class Z extends Y{ } 

Java不允许扩展多个类。

我们假设C类正在扩展A和B类。 然后假设A和B类具有相同名称的方法(例如:method1())。 考虑一下代码:

C obj1 = new C(); obj1.method1(); – 这里JVM不了解它需要访问哪种方法。 因为A和B类都有这种方法。 因此我们将JVM置于两难境地,这就是为什么从Java中删除多重inheritance的原因。 并且正如所说的实现多个类将解决此问题。

希望这有所帮助。

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

孩子不能有两个母亲

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

给出的大多数答案似乎都假设我们要inheritance的所有类都是由我们定义的。

但是,如果其中一个类没有被我们定义,即我们无法改变其中一个类inheritance的内容,因此无法使用已接受的答案,那么会发生什么呢?

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

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

inheritance类型1

好吧,你想要一个C类扩展类AB ,其中B是在其他地方定义的类,但A由我们定义。 我们可以做的是将A转换为接口,然后C类可以在扩展B A同时实现A

 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 

inheritance类型2

现在假设您有两个以上的类可以inheritance,同样的想法仍然存在 – 除了其中一个类之外,所有类都必须由我们定义。 所以说我们希望类Ainheritance以下类, BC ,… X ,其中X是我们外部的类,即在其他地方定义的类。 我们应用相同的想法,将所有其他类,但最后一个转换为接口,然后我们可以:

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

inheritance类型3

最后,还有一些情况,你只有一堆类inheritance,但没有一个是你定义的。 这有点棘手,但可以通过使用委托来实现 。 委托允许类A伪装成其他类B但是对A中定义的某些公共方法的任何调用实际上委托调用类型B的对象并返回结果。 这使得A类成为我称之为Fat class

这有什么用?

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

最初我们有以下外部类BCD ,…, X ,我们希望我们的新类Ainheritance所有这些类。

 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 } 

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

 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 } 

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

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