即使兼容类型可用,方法重载是否隐式类型转换为更大的类型

Does method overloading implicitly typecasts to larger type even though compatible type is available

当我执行下面的程序时,因为子 class 具有兼容的方法调用,本应转到子 class 而不是调用父 class 方法。是否存在导致此行为的超载规则?

public class OverrideTest {

public static void main(String[] args) {
    Parent d=new Child();

    d.test(10);

    d.add(1,2,3);        
   }
}


class Parent{

void test(double d) {
    System.out.println("Value of D:"+ d);
}

    public void add(double a, double b, double c){               
        double sum = a+b+c; 
        System.out.println("sum Double:"+ sum);

    } 
}

class Child extends Parent{

  void test(int i) {
    System.out.println("i:"+ i);
}

public void add(int a, int b, int c){          
        int sum = a+b+c; 
        System.out.println("sum Int:"+ sum);
    } 
}

在编译时选择要调用的方法。编译器只考虑存在于变量类型上的方法,即 Parent,因为它只知道 d 是一个 Parent.

因为它只知道 test(double)add(double,double,double),所以这些是将要调用的方法。因为它们在子 class 中没有被覆盖(仅重载),所以调用父 class 中的方法。

编译器自动将 int 参数扩展为双倍参数,使它们与方法的形式参数类型兼容。

d 在运行时更具体地说是 Child 这一事实未被使用。