类扩展多个Java类?

时间:2013-02-28 09:59:32

标签: java class inheritance subclass multiple-inheritance

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

TransformGroup inheritance

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

11 个答案:

答案 0 :(得分:50)

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

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

public class Dog extends Animal, Canine{

}

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

public class Canine extends Animal{

}

public class Dog extends Canine{

}

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

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

答案 1 :(得分:4)

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

class A
class B extends A
class C extends B

答案 2 :(得分:4)

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

interface A extends B, C

E.g。 MouseInputListener扩展了MouseListener和MouseMotionListener

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

class X implements A, F

答案 3 :(得分:3)

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

答案 4 :(得分:3)

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

  1995年2月,詹姆斯·戈斯林(James Gosling)提出了为什么要多元化的想法   Java不支持继承。

     

JAVA省略了许多很少使用,知之甚少,令人困惑的功能   C ++,在我们的经验中带来更多的悲伤而不是有益。这个   主要由运算符重载组成(尽管它确实有   方法重载),多重继承和广泛的自动化   强制转换。

答案 5 :(得分:3)

Multiple Inheritance http://bit.ly/1Z62XjI

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

答案 6 :(得分:2)

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

class A extends Object
class B extends A

答案 7 :(得分:2)

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

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

答案 8 :(得分:1)

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

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

答案取决于我们是否至少有一个类是由我们定义的。即我们希望继承的类列表中存在一个类A,其中A是由我们创建的。

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

继承类型1

好的说你希望课程C扩展课程AB,其中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继承以下课程,BC,... X其中X是一个外部的课程我们,即在其他地方定义。我们应用相同的想法将所有其他类,但最后一个转换为接口然后我们可以:

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

继承类型3

最后,还有一些情况,你只有一堆类继承,但没有一个是你定义的。这有点棘手,但可以通过使用delegation来实现。委托允许类A伪装成其他类B但是AB中定义的某个公共方法的任何调用,实际上都会将该调用委托给键入B并返回结果。这使得A类称为Fat class

这有什么帮助?

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

最初我们有以下外部课程BCD,...,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类型的对象不是我们开始使用的任何外部类的严格后代,而是公开了一个定义与这些类相同的方法的接口。

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

答案 9 :(得分:0)

Java不允许扩展多个类。

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

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

希望这有所帮助。

答案 10 :(得分:-1)

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

孩子不能有两个母亲

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