为什么这被称为多态性?

5
我正在观看这个视频,在2.52的时间点它给出了一个例子。它说Shape可以是一个接口或者一个抽象类,还有其他两个类,分别是TriangleCircleShape有一个名为draw的方法。
现在它说:
Shape shape=new Triangle();
shape.draw();

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

该视频声称这是多态性,但据我所知,多态性可以通过方法重载或方法覆盖来实现,如此文章所述。

请问有人能告诉我视频中的示例是否真正体现了多态性?非常感谢任何形式的帮助。


2
多态性是指父类可以成为许多子对象的蓝图。三角形和圆形都是形状,并共享通用功能,例如表面积。一个人作为父类,男性或女性作为子对象是另一个多态性的例子。 - Drew Kennedy
2
它是多态的,因为Shape是超类。 - Shahar
不用担心。我给你点赞是因为我认为这是一个好问题。欢迎来到 Stack Overflow。学习我们的规则是一个过程,犯错误是人之常情,特别是对于新手来说。 - La-comadreja
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - laune
可能是多态 vs 覆盖 vs 过载的重复问题。 - Julien
5个回答

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();

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

0

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

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");
    }
}

0

在Java中编写多态结构的方法有几种。多态性简单来说就是“创建一个变量、函数或对象,使其具有多种形式的能力。”

它之所以是多态的,是因为父类Shape中的方法draw()被多个子类Triangle和Circle重写了。因此,draw()有不止一种形式:即圆形和三角形形式。

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


0

三角形和圆形都是从Shape类继承而来的。Shape类可以持有子类的对象,因此多态性存在。你可以这样说:Triangle t = new Triangle(); 和 Circle c = new Circle();

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


0

一开始不要过于技术化,尝试从意义上理解。在面向对象编程中,多态的含义是对象具有不同的行为能力。现在让我们思考一下方法重载如何表示多态。

方法重载就是多态

在面向对象编程中,方法代表一种行为。使用Java中的方法重载技术,您可以创建一个具有相同名称但参数列表不同的方法,现在让我们开始思考...相同的名称意味着-->相同的行为,但我们知道即使名称相似,行为也不完全相同...简单来说就是多态。

例如:您在人类中有一个吃饭的方法,现在您创建了另一个带有不同参数列表的吃饭方法,根据调用哪个方法,期望的行为会发生变化。

方法覆盖就是多态

那么方法覆盖如何表示多态?让我们试着弄清楚这一点。在方法覆盖中,您覆盖了在超类中定义的方法。

例如:人类有一个吃饭的方法,现在您创建了一个超级人类类,它是人类的子类,然后覆盖了吃饭方法。

所以我们知道超人也有吃的能力,但是不同于过载,但现在我们面临一个展示多态性的问题。为什么呢?因为如果你创建一个人类实例,那么就只有一个方法,所以没有多态行为。同样,如果你创建一个超人实例,那么也只有一个方法和一个预期行为,所以也没有多态性。这就是我们如何演示多态性的方式。

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

我们不能仅仅通过观察左侧就说出哪个方法会产生哪个输出,因为“a”和“b”都是Human类型,所以编译器无法确定a.eat()和b.eat()的输出结果,直到代码实际运行,因此它是多态的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接