Java 动态绑定与方法匹配。这些方法如何matched/binded?

Java dynamic binding vs. method matching. How are these methods matched/binded?

我对以下代码及其输出有疑问:

public class MoarTests {

    public static void main(String[] args) throws Exception {
        Person p = new Student();
        Student s = new Student();
        
        p.m(0);     // Prints "Person method"
        p.m(0.0);   // Prints "Person method"
        
        s.m(0);     // Prints "Student method"
        s.m(0.0);   // Prints "Person method"
    }
}

class Person {
    public void m(double n) {
        System.out.println("Person method");
    }
}

class Student extends Person {
    public void m(int n) {
        System.out.println("Student method");
    }
}

我最困惑的情况是 p.m(0)s.m(0.0)。在 p.m(0) 中,选择的方法是 m(double n),即使给定的参数是一个整数,而在 s.m(0.0) 中,它匹配方法到 m(double n),即使在 Student 中有一个方法class 可以处理给定的双重论证。

变量的类型如何改变调用哪个方法?方法是如何选择的?

A.m(0) 在 class Person 中的方法之间进行选择,因为 APerson 的类型(即使实际对象的类型Student,它被声明为 Person 类型,因此被使用)。因为 A (Person) 的类型对子 class 方法不可见,所以这是唯一可用的选择,即带有 double 参数的方法。

如果有一个 int 方法和一个 double 方法,JVM 会选择 int 方法。实际上,这正是您调用 B.m(0) 时发生的情况。在这种情况下,JVM 有两个方法 m(int)m(double),它选择 m(int).

B.m(0.0) 与 int 不匹配,因为 0.0double 而不是 int