为什么这称为多态?

时间:2015-01-17 17:55:57

标签: java polymorphism

我正在看这个video,并在2.52时间给出了一个例子。它说Shape可以是Interface或抽象类,还有其他2个类,即TriangleCircleShape正在进行方法绘制。

现在说:

Shape shape=new Triangle();
shape.draw();

Shape shape=new Circle();
shape.draw();

并声称它是多态性。

但据我所知,多态性可以在方法重载或方法覆盖中完成,如article中所述。

有人可以告诉一下,视频中给出的例子真的是多态吗?提前感谢任何帮助。

5 个答案:

答案 0 :(得分:0)

有几种方法可以在Java中编写多态结构。多态性只是“创建变量,函数或具有多种形式的对象的能力。”

它是多态的,因为方法draw(),显然在父类Shape中,也被多个子类重写:Triangle和Circle。因此draw()有多种形式:圆形和三角形。

请参阅http://howtodoinjava.com/2013/07/15/what-is-polymorphism-in-java/

答案 1 :(得分:0)

Polymorphism表示具有多种形状或具有不同形式的能力的状态。考虑到这一点,形状可以采用多种形式,例如三角形或圆形。这些表单将具有共享属性,并按此编码和使用。作为另一个可能更好地帮助理解的例子,你可以拥有一个人,一个人可以有多种形式:男性和女性。

public abstract class Person {
   private String name;
   private int age;
   //additional code - functionalities that children classes share
}

public class Male extends Person {
   //fields and functionalities that males only have
}

public class Female extends Person {
   //fields and functionalities that females only have
}

然后,您可以通过动态绑定创建所需的性别:

Person male = new Male();
Person female = new Female();

要回答你的问题,是的,提供给你的例子确实是多态性。

答案 2 :(得分:0)

三角形和圆形都是从Shape类继承的。 Shape类可以保存子类的对象。所以多态性就在那里。你可以说Triangle t = new Triangle();和圆圈c =新圆圈();

但是这里你有超类持有子类对象Shape s = new Circle();多态 - 具有多种形式,

答案 3 :(得分:0)

多态性意味着一个对象可以采用多种形式。你可以说 形状a =新的三角形()因为三角形IS-A形状(三角形扩展形状)。你也可以说Shape a = new Circle()因为一个圆形是一个形状(圆形扩展形状)。在示例的第一行中,JVM将从Triangle类调用draw()方法。在第二行中,它将使用Shape引用调用Circle类中定义的draw()方法!

abstract class Shape {
    public abstract void draw();
}

class Triangle extends Shape {

    @Override
    public void draw() {
        System.out.println("Triangle");
    }
}

class Circle extends Shape {

    @Override
    public void draw() {
        System.out.println("Circle draw");
    }
}

答案 4 :(得分:0)

一开始不要太技术化,试着从意义上理解。 OOP中多态的含义是对象表现不同的能力。现在让我们想一想方法重载如何表示多态

方法重载是多态的

在OOP方法中表示一种行为,在java中使用方法重载技术你可以创建一个方法,它具有相同的名称但不同的参数列表,现在让我们开始思考..同名意味着 - &gt ;相同的行为,但我们知道即使名称是相似的行为不完全相同..简单的单词多态

示例:您现在在人类课程中使用eat方法创建另一个具有不同参数列表的eat方法,根据您调用预期行为更改的方法。

方法覆盖是多态性

那么方法覆盖是多态的?让我们尝试解决这个问题。 在方法覆盖中,您覆盖在超类中定义的方法。

ex:human有一个eat方法,现在你创建一个SuperHuman类,它是人类的一个子类,然后覆盖eat方法

所以我们知道SuperHuman也有吃但不同的能力,但现在不像重载这里我们有一个展示多态性的问题。为什么因为如果你创建了一个人类实例,那么就有一种方法,所以没有多态行为。就像你创建一个SuperHuman实例一样,那么有一个方法和一个预期的行为,所以没有多态性。所以这就是我们演示的方式

Human a = new Human();
a.eat();
Human b = new SuperHuman();
b.eat();

我们不能简单地通过仅查看左侧来说明哪个方法输出哪个,因为“a”和“b”都是人类类型,因此编译器无法确定a.eat的输出是什么( )和b.eat()直到代码实际运行,因此它是多态的。