所以我在学习动态编程时遇到了重载分辨率这个概念,但我很难理解这一点。语句如下所示 - “如果编译器找不到任何具有匹配参数类型的方法,或者在应用转换(强制转换)后多个方法都匹配,则编译器报告错误”
我试图在一个例子的帮助下验证声明,它跟下面一样 -
public class OverloadingResolution{
public static void main(String[] args){
ClassB b= new ClassB();
b.check(3);
ClassB c=new ClassC();
c.check(3)
}
}
class ClassA{
public void check(float a){
System.out.println("Inside ClassA----> value of a is"+a);
}
}
class ClassB extends ClassA{
public void check(float a){
System.out.println("Inside ClassB----> value of a is"+a);
}
}
class ClassC extends ClassB{
public void check(short a){
System.out.println("Inside ClassC----> value of a is"+a);
}
}
结果是: 在ClassB内部值---> a的值是3.0 在ClassB内部值---> a的值是3.0
我怀疑是我期望编译时错误为ClassB b= new ClassB();
,因为b有多个匹配参数的方法。
输出是正确的,因为在类C中没有执行方法重写,类C不会覆盖类B的check()方法,类C中的check方法被视为类C的单独方法。
注意: - 您正在代码中执行方法覆盖而不是方法重载,方法重载可以在单个类中完成。方法重载意味着同一方法名称相同但方法中的参数不同。在Method Overriding中,将有多个类。
方法覆盖的规则:
1.该方法必须与父类中的名称相同
2.该方法必须具有与父类相同的参数。
3.必须有一个IS-A关系(继承)。
据你说:“如果编译器找不到任何匹配参数类型的方法” - >编译器在类B中找到方法check(),那么它不会给出编译时错误。