有没有办法在java中扩展两个或更多类?

时间:2013-04-26 09:41:09

标签: java

我知道Java不允许我们扩展多个类。我知道接口也存在,这次我不想使用它们。是否有某种技巧或解决方法来扩展Java中的多个类?如果是,请同时提供示例代码。

12 个答案:

答案 0 :(得分:3)

不,与C ++不同,您不能扩展多个类,但可以实现多个接口。

答案 1 :(得分:3)

您可以使用界面和构图轻松

问题是为什么你会问这样的事情?为什么你不想“在这个时候”使用接口?

您必须知道Java只允许单一继承实现。你已经在SO工作了七个月,所以你必须知道如何使用搜索功能。这里一再提出这个问题。

更有创意。 JPanel没有理由必须是Observable。 JPanel用于呈现。我同意其模型数据可能想要是Observable。无论如何都要用组合来做。

答案 2 :(得分:2)

NO。

转到interfaces。没有多个inheritance in Java.

多重继承可能导致钻石问题。

  

JAVA省略了许多很少使用,知之甚少,令人困惑的C ++功能,这些功能在我们的经验中带来了比利益更多的悲伤。这主要包括运算符重载(虽然它确实有方法重载),多重继承和广泛的自动强制_ 博士。詹姆斯戈斯林

答案 3 :(得分:2)

java中的多重继承通常通过实现多个接口来完成。您不能扩展多个类。可能的解决方法可能是使用某种对象组合进行聚合。

答案 4 :(得分:1)

Java不支持这种类。你可以使用多个接口。你可以在java中找到多重继承的问题

您可以使用内部类,例如

 public class class1 extends class2{
  class Inner extends class3{

    }
   }

SEE HERE

答案 5 :(得分:1)

可能有帮助

    class One{
    void oneMethod(){

    }
}

class Two extends One{
    void TwoMethod(){

    }
}

class Abc extends Two{

    @Override
    void oneMethod() {
        // TODO Auto-generated method stub
        super.oneMethod();
    }

    @Override
    void TwoMethod() {
        // TODO Auto-generated method stub
        super.TwoMethod();
    }


}

答案 6 :(得分:1)

多重继承增加了复杂性而几乎没有什么好处,这就是为什么它不存在于java Why is Multiple Inheritance not allowed in Java or C#?

我能想到的一种方法是用支持它的语言(例如C ++)编写需要多重继承的程序,然后使Java代码与该程序的输出交互,例如使用文件或数据库。

答案 7 :(得分:0)

答案是否定的。但如果有帮助,你可以这样做:

A延伸B
B扩展了C

所以A扩展B和C

答案 8 :(得分:0)

改用接口。以下是代码中的外观:

public Class ClassName implements Interface1, Interface2 {

    Methods, fields etc...

}

答案 9 :(得分:0)

要避免 diamond problem Java不支持通过类进行多重继承,但它支持使用接口。 所以你可以使用关联关系。 e.g。

Class A {}
Class B {}
Class C implements SomeInterface {
  A a;
  B b;
  // setter getter for a and b and other methods
}

答案 10 :(得分:0)

您可以使用功能查找。

class Vehicle {

    T <T> lookup(Class<T> klazz) {
        return map.get(klazz); // typically
    }
}

interface Flyable {
    void fly();
}

Vehicle x;
Flyable f = x.lookup(Flyable.class);
if (f != null) {
    f.fly();
}

这解耦了类。它需要运行时检查。

它使用委托:实现查找类/接口的本地成员。

优势:

您可以从车辆派生一个可以飞行(可飞行)和潜水(潜水)的类。飞行可以通过共享类的实例来实现。您甚至可以动态组合功能(向船上添加轮子)。

这通常比实现多个接口更好,其中fly()可以是代码副本,也可以委托Flyable字段(具有共享实现类)。

特别是涉及多个接口/类时,否则会冒险使用案例和不安全的强制转换来冒犯基类对象(此处为Vehicle)的代码,忘记if (x instanceof Boat)

答案 11 :(得分:0)

我会打扰很多人,说是的,你可以 - 有点

这当然不容易,你必须使用反射但here你会找到一个允许你用另一个对象动态扩展一个对象的例子。显然,一旦你能做到这一点,你就可以扩展另一个。

本质上,它使用Proxy类来拦截方法调用并将它们定向到两个对象中的一个或另一个 - 这实现了A overrides B。这不是你想要的,但可以很容易地调整它来检测两个类中存在的方法并同时调用它们 - 从而动态地实现A extends B种类。

请注意,您需要阅读链接标题为使用动态代理的动态对象适配器部分。