当我执行下面的程序时,因为子类具有兼容的方法,调用应该转到子类,而是调用父类方法。是否存在导致此行为的重载规则?
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)
,因此这些是将被调用的方法。因为它们在子类中没有被重写(只是重载),所以调用父类中的方法。
编译器会自动将 int
参数加宽为 double,以使它们与方法的形式参数类型兼容。
没有使用 d
更具体地说是运行时的 Child
的事实。
关于java - 即使兼容类型可用,方法重载是否隐式类型转换为更大的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57079690/