我知道 Java 不允许我们扩展一个以上的类。我知道接口也存在,这次我不想使用它们。是否有某种技巧或解决方法可以在 Java 中扩展多个类?如果是,请同时包含示例代码。
12 回答
您可以使用界面和组合 轻松完成。
问题是你为什么会问这样的事情?为什么你不想“此时”使用接口?
你必须知道Java只允许实现的单一继承。你已经在 SO 呆了七个月,所以你肯定知道如何使用搜索功能。这个问题在这里被反复问过。
更有创意。JPanel 没有理由必须是可观察的。JPanel 用于渲染。我同意它的模型数据可能希望是可观察的。一定要用组合来做。
不,与 C++ 不同,您不能扩展多个类,但可以实现多个接口。
不。
去。interfaces
没有多个inheritance in Java.
多重继承会导致菱形问题。
JAVA 省略了 C++ 中许多很少使用、难以理解、令人困惑的特性,根据我们的经验,这些特性带来的痛苦多于好处。这主要包括运算符重载(尽管它确实有方法重载)、多重继承和广泛的自动强制 _ James Gosling 博士
java中的多重继承通常是通过实现多个接口来完成的。您不能扩展多个类。一种可能的解决方法可能是使用某种对象组合来进行实例聚合。
多重继承增加了复杂性而没有什么好处,这就是为什么它在 java 中不存在为什么在 Java 或 C# 中不允许多重继承?
我能想到的一种方法是用支持它的语言(例如C++)编写需要多重继承的程序,然后使您的Java 代码与该程序的输出交互,例如使用文件或数据库。
Java不支持这个类。你可以使用多个接口。你可以找到java中多重继承的问题
您可以使用内部类,例如
public class class1 extends class2{
class Inner extends class3{
}
}
可能这有帮助
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();
}
}
答案是否定的。但如果有帮助,您可以这样做:
A 扩展 B
B 扩展 C
所以 A 扩展了 B 和 C
改用接口。以下是代码中的样子:
public Class ClassName implements Interface1, Interface2 {
Methods, fields etc...
}
为了避免 菱形问题,Java 不支持通过类进行多重继承,但它支持使用接口。所以你可以使用关联关系。例如
Class A {}
Class B {}
Class C implements SomeInterface {
A a;
B b;
// setter getter for a and b and other methods
}
您可以使用功能查找。
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();
}
这解耦了类。但它需要运行时检查。
它使用委托:实现查找的类/接口的本地成员。
优势:
您可以从 Vehicle 派生一个既可以飞行(Flyable)又可以潜水(Diving)的类。飞行可以通过共享类的实例来实现。您甚至可以动态组合功能(为船添加轮子)。
这通常比实现多个接口更好,其中fly()
要么是代码副本,要么委托给 Flyable 字段(具有共享实现类)。
尤其是涉及多个接口/类时,否则会冒着在基类对象(此处为车辆)上使用案例和不安全强制转换的风险,忘记if (x instanceof Boat)
.