阐述多态性

时间:2015-07-06 00:33:44

标签: java oop polymorphism override

关于多态性,我已经阅读了很多关于stackoverflow的问题。问题是构建我的想法的问题,因为我已经阅读和研究了很多,我想到了很多想法。我需要对我对多态性的看法提出意见和批评。我将使用Java来展示我的想法。

多态性是在谈论某个实体时具有不同形式的特征。它可以通过以下方式实现:

  • 派生类从其基类继承所有可见方法,因此可以override某些方法的行为。 e.g:

    class Shape {
       void draw(){
             System.out.println("I am drawing using a shape object");
       }
    }
    
    class Rectangle extends Shape{
       void draw(){
         // This method is overriden
         System.out.println("I am drawing using a rectangle object");
       }
    }
    

在这里实现多态的方式是,如果在运行时,draw()Rectangle的实例一起使用,draw()类中Rectangle的实现将会被调用。

由于矩形是一个形状,因此多态性是draw()采用不同形式的事实,具体取决于调用它的上下文。这也称为继承多态。

  • 实现多态的另一种方法是通过接口。

    interface Vehicle{
         void move();
    }
    
    class Car implements Vehicle{
         void move(){
             System.out.println("The car is moving!");
         }
    }
    
    class Plane implements Vehicle{
         void move(){
             System.out.println("The plane is flying!");
         }
    }
    
    // we declare an object of type Vehicle
    // At compile-time, the concrete implementation of someVehicle is no known  
    // and thus polymorphism is achieved in the sense that someVehicle could
    // either be a Car or a Plane depending on which concrete class is used 
    // to instantiate it at run-time.
    
    Vehicle someVehicle;
    
  • 用户定义的运算符重载(不是Java,但是使用C ++)

在Java中,运算符重载的一个例子是+运算符,根据操作数,+执行某个功能。如果+正在应用于字符串,则将它们连接起来。如果它被应用于整数,它会进行算术加法。

现在,方法重载也是一种实现多态的方法吗?在理解多态性时我错过了什么?

3 个答案:

答案 0 :(得分:1)

多态性这个词意味着"许多形式"

您提供的两个示例是多态性的确切有效示例:

  • 在第一个例子中,你有很多表格" " draw"功能取决于你所调用的对象是什么样的形状" draw"上

  • 在第二个你有"许多形式" "移动"功能取决于车辆

由于后期绑定,将在运行时决定实际调用的方法。

实际上,两个示例都非常相似,它们都是子类型的示例,这是您在Java中实现多态的方式。

请注意,Java中需要子类型,因为Java是一种静态类型语言。在像Smalltalk这样的动态类型语言中,有" draw"的不同实现。方法就够了,即使对象'类不属于同一个类层次结构。

现在,关于方法重载:如果您定义了接收不同参数类型的方法的多个版本,那么您也有"多种形式&#34 ;那种方法。

不同之处在于,在这种情况下,决定在编译时调用哪种方法。这就是为什么许多人将方法重载称为静态多态的原因。

然而,由于它是静态的,你可以基本上通过给方法赋予不同的名称并根据你使用的类型决定自己调用哪一个来实现同样的事情,很多人会还说方法重载实际上并不是多态的。

我认为它基本上取决于"多态性的定义"你想使用,但我希望上面的解释有助于澄清差异。

答案 1 :(得分:0)

我认为你对java中发生的其他事情感到困惑。运算符重载是其他编程语言(如C ++)中的一种多态形式,但在java中,它们区分了诸如int和booleans之类的原始符号(String类型)以及扩展基本java.lang.Object的所有其他内容。语言设计者决定不对类进行运算符重载,因为它可能非常混乱。因此,您不能在Java中有效地使用运算符多态,因为除了toString()方法之外,您无法定义自己的运算符或覆盖其他运算符,但在我看来,这实际上是一个接口。我不认为你可以说+(for strings)运算符是java中运算符重载的一个例子,即使是字符串,它也是被调用的toString()方法,而且我的运算符不是真正的运算符重载意见是因为当您应用规则时,操作员只有执行操作的顺序时才有该术语。如果你只有一个运算符,那么将字符串连接到其他运算符,那么就不会应用任何符合评估顺序的规则,因此它很合理。你有+, - ,/的运算符用于整数和浮点数,但你不能重载它们,因此不是多态。

答案 2 :(得分:-1)

多态性的行为与您所解释的方式相同,但不是实现覆盖先前定义的方法的新方法的实际行为。多态性更像是一种抽象的概念。一般来说:

  

多态性是一种物体采取多种形式的能力。该   在父类中,OOP中最常见的多态性使用   reference用于引用子类对象。

还可以找到更多信息here