所有的动态绑定都是一种多态吗?

Is all dynamic binding a kind of polymorphism?

是不是所有的动态绑定都算多态?具体来说,我说的是 Java。如果不是,请解释这两个术语。

据我所知:不是所有的继承都是多态,但是所有的多态都使用了继承。

首先dynamic binding (or late binding) is an improper term. You are talking about dynamic dispatch这是另一回事。

动态绑定 正在选择在运行时将调用哪个方法的实现,但这在 Java 中不会发生。但是你有动态调度,这是在编译时选择方法的正确多态实现的能力(通常转化为选择最专业的method/function).

但我不会说动态调度就是多态性,我会说要支持多态性你需要一种机制来选择方法的正确实现,这就是动态调度。

继承是一种称为subtyping(或子类型多态)的多态性,所以,与你所说的相反,继承始终是多态性的一种形式,但其他存在多种多态性,想想:

  • ad hoc polymorphism(通过重载实现)同一个函数在不同的参数上有不同的含义
  • parametric polymorphism(在 Java 中使用泛型实现),其中类型带有类型变量,因此单个类型可以通过将变量绑定到特定类型(或class 种),考虑 List<Integer>

如果方法调用是在运行时决定的——那就是动态多态。如果方法调用在编译时由编译器决定,则称为静态多态性。

示例:

public static void eat (Veg vegetable) {
    System.out.println("I am vegetarian");
}
public static void eat(Meat meat) {
    System.out.println("I am non-vegetarian");
}

//if your main is this way
public static void main(String args[])
{
    Veg v = new Meat();
    callEat(v);
}

它打印 "I am vegetarian" 。这是由编译器在运行时决定的。它也被称为方法覆盖。

int add (int a , int b){
    return a+b;
}

int add(int a, int b, int c){
     return a+b+c;
}

void main (){
   add(1,2);
   add(1,2,3);
}

此处根据传递的参数选择函数,即使方法的名称和 return 类型相同也是如此。这是在编译时完成的。这就是静态多态。它也被称为方法覆盖。