以下代码是否将后期绑定应用于静态方法?多态性 Java

Did this following code apply late binding onto a static method? Polymorphism Java

所以我在Java中玩弄以了解多态性的概念,然后我写了这个:

public class Practice 
{
    public static void main(String[] args) 
    {
        Parent p = new Child();
        
        p.instanceMethod();
    }
}

class Child extends Parent {
     public void instanceMethod(){
         System.out.println("child's instance method");
         staticMethod();
     }
     public static void staticMethod() {
         System.out.println("child's static method");
     }
}

class Parent {
     public void instanceMethod(){
         System.out.println("parent's instance method");
         staticMethod();
     }
     public static void staticMethod() {
         System.out.println("parent's static method");
     }
}

所以输出是:

child's instance method
child's static method

为什么静态方法是从 child 的 class 而不是从它的静态类型 Parent 的 class 调用的?

是不是因为,它首先被child的class中的实例方法调用,所以此时它的类型已经是完全动态的,又名child的类型?

静态方法不'do'多态。完全没有。

non-static(即实例)方法可以。方法的 signature 是完全静态绑定的;在类型层次结构中找到实际 运行 方法的实际前景完全是动态完成的(后期绑定)。

对于静态方法,整个事情都是完全静态的。

那么,让我们看一下这段代码:

p.instanceMethod()

表达式 p 的类型为 Parent。编译器查看 Parent 及其所有超类型中可用的签名,并确定此 instanceMethod() 调用尝试调用的完整方法签名是 void instanceMethod()。此调用(字节码中的 Parent::instanceMethod()V)在发出的 .class 文件中进行编码。

在 运行 时间,系统检查 p 表达式解析的实际 运行 时间类型(即您之前所做的 new Child()),并进行动态调度。选择并执行 Childpublic void instanceMethod(),它显然覆盖了 Parent 中的 public void instanceMethod(),因此打印了 "child's instance method"

staticMethod() 在 Child

接下来,让我们看一下 staticMethod 调用:在编译时,javac 确定这显然是对 ChildstaticMethod() 的引用。它在字节码中将 INVOKESTATIC 字节码编码为 Child::staticMethod()V。动态分派现在或从未应用于静态方法调用。

在 运行 时..调用了该方法。

就这么简单。

也许您希望静态方法仍然首先检查调用上下文,但这不是 java 的工作方式。