为什么喜欢构图而不是继承呢?每种方法都有哪些权衡取舍?什么时候应该选择继承而不是作文?
两个具有相同方法名称和签名的接口.但是由单个类实现,那么编译器将如何识别哪个接口的方法是什么?
例如:
interface A{
int f();
}
interface B{
int f();
}
class Test implements A, B{
public static void main(String... args) throws Exception{
}
@Override
public int f() { // from which interface A or B
return 0;
}
}
Run Code Online (Sandbox Code Playgroud) 为了完全理解如何解决Java的多重继承问题,我有一个经典的问题需要澄清.
可以说我有类Animal
此有子类Bird
和Horse
我需要做一个类Pegasus
,从扩展Bird
和Horse
自Pegasus
既是一只鸟和一匹马.
我认为这是经典的钻石问题.从我能理解经典的方式来解决,这是使Animal
,Bird
和Horse
类接口,并实现Pegasus
从他们.
我想知道是否有另一种方法来解决我仍然可以为鸟类和马创造物体的问题.如果有一种方法可以创造动物,那将是伟大的但不是必要的.
java oop multiple-inheritance diamond-problem multiple-interface-implem
Java不允许多重继承,但它允许实现多个接口.为什么?
我被告知Java中的Marker接口是一个空接口,用于向编译器或JVM发出信号,表明必须以特殊方式处理实现此接口的类的对象,如序列化,克隆等.
但最近我了解到它实际上与编译器或JVM无关.例如,在的情况下,Serializable
接口的方法writeObject(Object)
的ObjectOutputStream
不喜欢的东西instanceOf Serializable
,以检测类实现是否Serializable
与抛出NotSerializableException
相应.一切都在代码中处理,这似乎是一个设计模式,所以我认为我们可以定义自己的标记接口.
现在我怀疑了:
上面提到的标记接口的定义在第一点是错误的吗?那么我们如何定义Marker接口呢?
而不是使用instanceOf
运算符为什么不能使方法类似于writeObject(Serializable)
有一个编译时类型检查而不是运行时?
注释如何比标记接口更好?
首先......对不起这篇文章.我知道stackoverflow上有很多帖子正在讨论多重继承.但我已经知道Java不支持多重继承,我知道使用接口应该是另一种选择.但我不明白并看到我的困境:
我必须对用Java编写的非常大且复杂的工具进行更改.在此工具中,有一个数据结构,它由许多不同的类对象构建,并具有链接的成员层次结构.无论如何...
Tagged
具有多个方法的类,并根据对象的类返回一个对象标记.它需要成员和静态变量.XMLElement
允许链接对象,最后生成一个XML文件.我还需要成员和静态变量.XMLElement
,其中一些Tagged
.好的,这不会起作用,因为它只能扩展一个类.我经常读到Java的所有内容都没问题,也没有必要进行多重继承.我相信,但我不知道接口应如何取代继承.
我真的不明白所以请有人解释我如何处理这个问题?
我认为多重继承在Java中总是非法的,但是这段代码编译:
public interface A {
void a();
}
public interface B {
void b();
}
public interface AB extends A, B {
}
Run Code Online (Sandbox Code Playgroud)
有一个空的界面,如AB
被认为是一个坏的做法?有没有办法在避免空接口(使用泛型或其他方式)的同时实现类似的东西?
注意:我不是在问如何通过接口模拟多重继承.我意识到我可以做到以下几点:
public class AbImpl implements A, B {
public void a() {}
public void b() {}
}
Run Code Online (Sandbox Code Playgroud)
由于各种原因,我需要一个具有两种方法的接口.
Java不允许从多个类继承(仍允许从多个接口继承.),我知道它非常符合经典的钻石问题.但是我的问题是,当从多个基类继承时没有歧义(因此没有钻石问题的可能性)时,java不允许像C++这样的多重继承?
如果我有4种不同的Java类型(称之为A B C D
),并且A
是子类型B
并且A
是子类型C
且B
是子类型D
且C
是子类型D
,这是合法的吗?那里有什么例子吗?
绘制图表:
D
| |
| |
B C
| |
| |
A
Run Code Online (Sandbox Code Playgroud)
所以D是超类型.谢谢!
我正在尝试在java中执行以下操作:
public class ClassName<E> extends E
Run Code Online (Sandbox Code Playgroud)
不过这样做,我得到了:
error: unexpected type
Run Code Online (Sandbox Code Playgroud)
是不是就是这样,java不能这样做? - 如果是的话,我将如何实现这种效果?它在C++中完美运行,使用模板,类似:
template<typename E>
class ClassName: public E
Run Code Online (Sandbox Code Playgroud)
我真正想要实现的是能够以这种方式将类链接在一起,以实现java中多重继承的效果.
好吧,我目前正在开发一个使用JFrame和Applet的应用程序.
为什么我们不能延伸两者..
public class myClass extends Applet, javax.swing.JFrame {...}
//invalid...
Run Code Online (Sandbox Code Playgroud)
有效的代码是.
public class myClass extends Applet {
javax.swing.JFrame frame = new javax.swing.JFrame();
public void init(){
frame.setSize(300, 400);
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
为什么这样?为什么我们不能扩展多个班级
java ×10
inheritance ×4
oop ×4
interface ×3
aggregation ×1
class ×1
composition ×1
extends ×1
generics ×1
overriding ×1
subtype ×1
templates ×1