方法是否隐藏了多态性的一种形式?

Is method hiding a form of Polymorphism?

多态性是采用多种形式的能力。方法覆盖是运行时多态性。

我的问题是:

  1. Java有没有静态多态之类的东西?

  2. 方法隐藏可以被认为是多态的一种形式吗?

在这个question's answer中说静态方法不是多态的。这是什么原因?

多态

Static Binding/Early binding/Compile time binding - Method overloading.(in same class)
Dynamic binding/Runtime binding/Method overriding.(in different classes.)

java

中的多态性

它只有两个类型,Method overloadingMethod overriding,一旦method overriding变成Method Hiding,它就失去了多态性。

参考以下来自 Whosebug 的问题。

1.) Question1

2.) Question2

运行时的多态性采用"dynamic dispatch"的形式。也就是说,被调用的实际方法是根据您调用该方法的实际实例来确定的。显然,这仅适用于您拥有 class 的实例时,因此严格来说,多态性不适用于静态方法的隐藏。进一步解释差异 check here.

如果我们运行这个测试

class A {
    static void x() {
        System.out.println("A");
    }
}

class B extends A {
    static void x() {
        System.out.println("B");
    }
}

class Test {
    public static void main(String[] args) throws Exception {
        A a = new B();
        a.x();
    }
}

它将打印 A。如果方法 x() 是多态的,它将打印 B。

  1. 多态性可以是静态的也可以是动态的。重载是静态多态,覆盖是动态多态。 简单来说,重载意味着两个方法具有相同的方法名称但采用不同的输入参数。这称为 static 因为,要调用的方法将在编译时决定 覆盖意味着派生 class 正在实现其超 class.
  2. 的方法

我认为方法隐藏在技术上被认为是多态的。根据定义,隐藏方法与其基础 class 中的方法具有相同的签名或形式。这只是其 "many forms" 之一。将其视为重载... "override" 恰好是完全相同的签名。这就是静态多态性。