遗传和多态性的主要区别是什么?

我今天在模块打开书考试结束时提出了这个问题,发现自己迷路了。 我正在读Head first Java和两个定义似乎是完全一样的。 我只是想知道自己心中的主要区别是什么。 我知道有一些类似的问题,但是,我没有看到哪一个提供了明确的答案。

inheritance是当一个“类”从一个现有的“类”派生。 所以,如果你有一个Person类,那么你有一个扩展PersonStudent类, Student inheritancePerson拥有的所有东西。 在Person中的字段/方法上放置访问修饰符的时候有一些细节,但这是基本的想法。 例如,如果您在Person上有一个私人字段, Student将不会看到它,因为其私有字段和专用字段对于子类不可见。

多态性处理程序如何决定使用哪种方法,具体取决于它的types。 如果你有一个Person ,它有一个read方法,并且你有一个扩展了PersonStudent ,它有它自己的read的实现,被调用的方法是由运行时确定的,这取决于你是否有PersonStudent 。 它有点棘手,但是如果你做了类似的事情

 Person p = new Student(); p.read(); 

Student的读取方法被调用。 这就是多态行为。 你可以做这个任务,因为Student 是一个 Person ,但是运行时足够聪明,知道p的实际types是Student

请注意,各种语言的细节不同。 例如,你可以在JavaScript中进行inheritance,但是与在Java中工作的方式完全不同。

inheritance是指在一个子类中使用超类的结构和行为

多态性是指改变子类中超类的行为

多态性 :以类似的方式处理不同types对象的能力。 例如:长颈鹿和鳄鱼都是动物,动物可以Move 。 如果你有一个Animal的实例,那么你可以调用Move而不知道或关心它是什么types的动物。

inheritance :这是同时实现多态性和代码重用的一种方式。

其他forms的多态 :还有其他方式来实现多态,比如接口,它只提供多态而不重用代码(有时代码是非常不同的,比如Move for a Snake与Move for a Dog,在这种情况下,接口将是更好的多态select。

在其他dynamic语言中,可以用Duck Typing来实现多态,这些类甚至不需要共享相同的基类或接口,他们只需要一个同名的方法。 或者甚至更像Javascriptdynamic,甚至不需要类,只是具有相同方法名称的对象可以多态使用。

主要的区别是多态是inheritance的一个具体结果。 多态性是基于对象的types在运行时确定要调用的方法的位置。 当一个类从另一个类inheritance并重写某个特定的方法时,会出现这种情况。 然而,在一个正常的inheritance树中,你不必重载任何方法,因此并不是所有的方法调用都是多态的。 那有意义吗? 所有的福特汽车都是汽车,但是并不是所有的汽车都是福特(尽pipe不太完美)。

此外,多态处理方法调用,而inheritance也描述数据成员等。

在Java中,这两者密切相关。 这是因为Java使用称为“dynamic调度”的方法调用技术。 如果我有

 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 

然后,我们看到Binheritance了A的spin 。然而,当我们试图操纵对象,就好像它是Atypes一样,我们仍然得到B的draw行为。 draw行为是多态的。

在某些语言中,多态性和inheritance关系并不十分密切。 例如,在C ++中,未声明为虚拟的函数是inheritance的,但不会dynamic分配,因此即使在使用inheritance时也不会获得该多态行为。

在JavaScript中,每个函数调用都是dynamic调度的,而且你的input很弱。 这意味着你可以有一堆不相关的对象,每个都有自己的draw ,有一个函数遍历它们并调用函数,每个对象都会performance得很好。 你会有你自己的多态绘制而不需要inheritance。

多态性:假设你为一家销售笔的公司工作。 所以你做了一个非常好的课,叫做“笔”,它处理你需要知道的一切。 您可以使用Pen类编写各种类别的账单,发货,创build发票。 一天,老板来了,说:“好消息!公司正在成长,我们现在正在销售书籍和CD!” 不是好消息,因为现在你必须改变使用Pen的每个类也使用Book&CD。 但是如果你最初创build了一个名为“SellableProduct”的接口,那么Pen实现了这个接口。 然后,你可以写你所有的运输,发票等类使用该接口,而不是笔。 现在,您只需创build一个名为Book&CompactDisc的新类,该类实现SellableProduct接口。 由于多态,所有其他类可以继续工作而不用改变! 合理?

所以,这意味着使用inheritance是实现多态的方法之一。

多态主义可以在类/接口中实现,但inheritance总是在2个或更多的类/接口之间。 inheritance总是符合“是 – ”的关系,而不总是与多态(它可以符合“是 – 一个”/“有一个”的关系。

inheritance是一个静态的东西(一个类扩展另一个),而多态是一个dynamic的/运行时的东西(一个对象根据其dynamic/运行时types而不是静态/声明types)。

例如

 // This assignment is possible because B extends A A a = new B(); // polymorphic call/ access a.foo(); 

– >虽然a的静态/声明types是A,但实际的dynamic/运行时types是B,因此a.foo()将执行f中所定义的foo而不是A中的定义。

多态性是一种expression具有相似特征的物体types之间的共同行为的方法。 它也允许通过重写来创造这些特征的变化。 inheritance是一种通过对象层次结构实现多态的方法,对象层次结构表示对象expression关系和抽象行为。 这不是实现多态的唯一方法。 原型是另一种表示与inheritance不同的多态的方式。 JavaScript是使用原型的语言的一个例子。 我想也有其他的方法。

inheritance是一个与代码重用相关的概念。 例如,如果我有一个父类说Animal ,它包含某些属性和方法(对于这个例子说makeNoise()sleep() ),我创build两个孩子类称为DogCat 。 由于狗和猫都以相同的方式入睡(我假设),因此不需要在父类Animal提供的DogCat子类中为sleep()方法添加更多的function。 然而,一只狗叫,一只Cat叫,所以虽然Animal类可能有一种噪音的方法,狗和猫相对于彼此和其他动物产生不同的噪音。 因此,有必要重新定义他们的具体types的行为。 因此定义了多态性。 希望这可以帮助。

inheritance是当类Ainheritance所有父类的所有非静态保护/公共方法/字段,直到对象。

如果你使用JAVA,就像这样简单:

多态是使用inheritance的方法,但“覆盖”他们做不同的事情(或者如果你调用超级,所以不会在技术上是多态的相同)。

如我错了请纠正我。

多态性的主要目的是:为超类创build引用variables,并保存子类 object =>一个对象可以执行多个行为

inheritance中子类inheritance超类的属性。

Oracle文档精确地引用了这个区别。

inheritance:类inheritance所有超类的字段和方法 ,无论是直接的还是间接的。 子类可以覆盖inheritance的方法,也可以隐藏它inheritance的字段或方法 。 (请注意,隐藏字段通常是不好的编程习惯。)

多态性: 多态性指生物学中的一个原理,生物体或物种可以有许多不同的forms或阶段。 这个原理也可以应用于面向对象的编程和像Java语言这样的语言。 类的子类可以定义自己的唯一行为,但是可以共享父类的一些相同的function。

多态性不适用于字段。

相关文章:

多态vs覆盖vs重载