对多态感到困惑

时间:2020-05-06 09:32:03

标签: java oop polymorphism

我经常阅读有关多态的定义,例如:

多态是具有不同类型对象的能力 理解同一条消息

但是,如果我们不使用多态性,例如,如果我们有一个类型为Circle且方法为draw()的对象,而另一个类型为Rectangle的对象,则上述定义也适用使用方法draw(),我们可以做到:

circle1.draw();
rectangle1.draw();

因此circle1rectangle1在不使用多态的情况下理解了同一条消息draw()

我想念什么吗?

4 个答案:

答案 0 :(得分:2)

在您的示例中,您只有两个不同的类,其中“ draw”方法是相同的,但这不是出于政治目的。

但是,如果您有这样的接口或抽象类:

public class pol {
    public static void main(String[] args) {
        Shape[] shapes = {new Circle(), new Rectangle()};
        for(Shape s: shapes) {
            s.draw();
        }
    }
}

interface Shape {
    void draw();
}

class Circle implements Shape{

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

class Rectangle implements Shape{

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

然后,即使您以Shape的形式访问它,也会执行每个单独的方法绘制。因此输出将是:

Circle
Rectangle

答案 1 :(得分:1)

我想分享基本示例:

interface Shape{
 void draw();
}

class Circle implements Shape{

    @Override
    void draw(){
    //Draw Circle here.
    }
}

class Rectangle implements Shape{

    @Override
    void draw(){
    //Draw Rectangle here.
    }
}

所以在您的示例中:

circle1.draw();
rectangle1.draw();

您可以安全地同时调用圆形和矩形对象的绘制方法,因为它们实际上都是形状。 circle1既是Circle也是Shape,矩形1既是Rectangle也是Shape。即多态,对象可以是一种以上。

答案 2 :(得分:0)

您提到的draw()方法完全不同,属于不同的类。 是的,在多态中,对象可以理解方法签名,但是有一些区别。 例如,假设他们有一个方法可以设置两个对象的直径,而没有多态性,则您必须实现与对象一样多的方法! 但例如,因为每个对象的确存在差异,因此以自己的方式定义它们的面积。

答案 3 :(得分:0)

以防万一您不喜欢技术答案...

理解多态的一种方法是“一种使代码与执行相同操作的各种方式进行交互的方式,而又不知道其操作方式。”

假设您有一个打印数据的程序。这个概念非常广泛,因此您首先要从txt文件读取。
您将您的课程称为“ TxtReader”。
实施之后,您很快就会意识到txt不是保存数据的好方法....
因此,您决定使用数据库。
现在,您看一下代码,并使用TxtReader.read()对其进行了硬编码。

更改以前被证明可以运行的代码是一个糟糕的主意,因为它可能会带来新的问题。
所以-
您创建一个名为“ Reader”的接口,并为其提供一个方法“ read()”。

现在,您回到代码,并让TxtReader实现Reader。 然后将代码更改为Reader.read()。 现在,只要它包含方法read(),就可以进行任何数量的Reader实现,例如SqlReader,HtmlReader,PhpReader等。

现在,所有这些实现都可以在需要时将其变形为一个简单的Reader。

这使您可以编写代码而不必担心太多可能的实现。 所以我们喜欢使用接口。

对于一个程序员来说,这是一个省时的方法,但是对于任何一个项目,如果有多个人从事同一工作,则可以节省大量的时间和金钱。