我对多态性的理解是,它是实现抽象的方法之一?每个人都同意我的观点吗?或者我的想法有什么缺陷?
答案 0 :(得分:1)
<强>多态性强>
这是能够以更有效的方式处理不同反应的对象的能力。不同的对象反应不同,但共享相同的方法。这些方法可以在一个通用界面中找到。
例如,如果我们使用不同类型的鸭子,我们可以说它们都有共同的东西,但是以稍微不同的方式进行。
Duck[] ducks = new Duck[3];
ducks[0] = new MallardDuck();
ducks[1] = new RedheadDuck();
ducks[2] = new RubberDuck();
for(int i=0; i < ducks.length; i++) {
System.out.println("Duck #" + (i + 1) + ":\n---------------------");
ducks[i].quack();
ducks[i].display();
System.out.println(ducks[i].toString() + Driver.BLANK_LINE);
}
输出:
Duck #1:
---------------------
Quack
Drawing a Mallard Duck to screen
MallardDuck@15db9742
Duck #2:
---------------------
Quack
Drawing a Red Headed Duck to screen
RedheadDuck@6d06d69c
Duck #3:
---------------------
Squeak!
Drawing a Rubber Duck to screen
RubberDuck@7852e922
使用界面&#34; Duck&#34;围绕鸭子的类型,允许程序员调用for循环,在循环中他们可以调用包含在&#34; Duck&#34;中的任何方法。接口
<强>抽象强>
现在您可能认为抽象和多态性相似可能就是您构建界面的情况。以#34; Duck&#34;接口例如:
public interface Duck {
public abstract void display();
public abstract void performQuack();
}
你可以看到它和它一样抽象。真正的接口不提供任何指令。它只是创建了一组需要在每个实现它的类中的常用方法。通过这种方式,你可以有许多类似的东西,它们的反应不同,遵循一个共同的&#34;抽象&#34;一套常用方法。
有可能采用不那么抽象的方式来控制你的鸭子。您可以将其设置为&#34;抽象类&#34;而不是将其设置为&#34;接口&#34;。
public abstract class Duck {
public abstract void display();
public abstract void performQuack();
public void swim() {
System.out.println("All ducks float, even decoys!");
}
}
在这堂课中#&#34;游泳&#34;方法被添加。该方法包含静态反应。 &#34;游泳&#34;上课是山脊。它可以被覆盖,但是,它甚至没有与其他方法在这个类中的抽象程度相比。
为什么它僵硬?显而易见的答案是输出的字符串。看起来更接近,它输出的方式(到控制台)使它更加僵化。
如果您的程序不支持控制台怎么办?
这就是抽象很重要的原因。
<强>结论强>
在某种程度上,你走在正确的轨道上。您不需要抽象来实现多态性。然而,你的好奇心在哪里是正确的。没有抽象,没有必要使对象具有多态性。如果每个对象完全相同,那么这些对象不需要分开。它们只需要是同一个对象的单独实例。
我希望这有助于澄清多态与抽象之间的区别。