在今天的模块开卷考试结束时,我遇到了这个问题,我发现自己迷失了方向。我正在读Head first Java
,这两个定义似乎完全相同。我只是想知道我自己的想法的主要区别是什么。我知道有许多类似的问题,但我还没有看到一个明确的答案。
发布于 2011-06-10 23:03:22
主要的区别是多态性是遗传的特定结果。多态性是在运行时根据对象的类型确定要调用的方法。当一个类继承了另一个类并覆盖了一个特定的方法时,就会出现这种情况。然而,在普通的继承树中,您不必覆盖任何方法,因此并不是所有的方法调用都必须是多态的。这有意义吗?这是一个类似的问题,所有的福特汽车都是汽车,但并不是所有的汽车都是福特(尽管不完全是……)。
此外,多态性处理方法调用,而继承也描述数据成员等。
发布于 2011-06-10 23:18:36
在Java中,这两者密切相关。这是因为Java使用了一种称为“动态调度”的方法调用技术。如果我有
public class A {
public void draw() { ... }
public void spin() { ... }
}
public class B extends A {
public void draw() { ... }
public void bad() { ... }
}
...
A testObject = new B();
testObject.draw(); // calls B's draw, polymorphic
testObject.spin(); // calls A's spin, inherited by B
testObject.bad(); // compiler error, you are manipulating this as an A
然后,我们看到B从A继承了spin
。然而,当我们试图操作对象时,就好像它是一个类型A一样,我们仍然得到了B对draw
的行为。draw
行为是多态的。
在某些语言中,多态性和继承没有那么紧密地联系在一起。例如,在C++中,未声明为虚的函数是继承的,但不会动态分派,因此即使使用继承也不会获得多态行为。
在javascript中,每个函数调用都是动态分派的,这样你就有了弱类型。这意味着您可以有一堆不相关的对象,每个对象都有自己的draw
,有一个函数迭代它们并调用该函数,每个对象的行为都很好。您将拥有自己的多态绘图,而不需要继承。
发布于 2012-12-16 08:55:25
多态性:假设你在一家销售钢笔的公司工作。所以你创建了一个非常好的类,叫做" pen“,它处理了你需要知道的关于笔的所有事情。您可以编写各种用于计费、运输、开具发票的类,所有这些都使用Pen类。一天,老板来了,他说:“好消息!公司正在发展,我们现在开始卖书和CD了!”这不是个好消息,因为现在你必须更改每个使用Pen的类,使其也使用Book & CD。但是,如果您最初创建了一个名为"SellableProduct“的接口,并且Pen实现了此接口,会发生什么呢?然后,您可以编写所有的发货、发票等类来使用该接口,而不是Pen。现在,您需要做的就是创建一个名为Book & CompactDisc的新类,该类实现SellableProduct接口。由于多态,所有其他类都可以继续工作,而不需要更改!讲得通?
因此,这意味着使用继承,这是实现多态性的一种方式。
多态可以在一个类/接口中实现,但继承总是在两个或更多个类/接口之间进行。继承总是符合" is -a“关系,而它并不总是符合多态性(它可以符合"is-a”/ "has-a“关系。
https://stackoverflow.com/questions/6308178
复制相似问题