我有3个课程GrandParent
,Parent
和Child
,其中
Child extends Parent
和Parent extends GrandParent
public class Main {
void test(GrandParent gp){System.out.println("GrandParent");}
void test(Parent p){System.out.println("Parent");}
public static void main(String args[]){
GrandParent obj = new Child();
Main mainObj = new Main();
mainObj.test(obj); // This calls test(GrandParent gp)
mainObj.test(new Child()); // This calss test(Parent gp)
}
}
在test()
方法的2次调用中的上述代码中,Child
个对象都调用了不同的方法。其中一个是编译时和其他运行时绑定。这对我来说听起来很奇怪。你怎么解释这个?
答案 0 :(得分:8)
方法重载是编译时多态。
方法覆盖是运行时多态性。
在您的情况下,您正在重载类Main
的两个实例方法。
但是,由于我在您的上下文中假定Child
扩展Parent
,new Child() instanceof Parent == true
因此Child
的实例是方法test
的有效参数参数类型Parent
。
在第一种情况下,您在方法GrandParent
中传递引用类型test
,并找到确切的类型。
在第二种情况下,您在方法Child
中传递引用类型test
。最接近的匹配是Parent
,因此调用test(Parent p)
。
答案 1 :(得分:0)
重载意味着同名不同的参数。 例如:
class A {
public void m1(int a) {
System.out.println("class A");
}
public void m1(int a,int b) {
System.out.prinln("2 parameter");
}
}
这称为方法重载。
答案 2 :(得分:0)
我认为你对你的等级制度感到困惑。
你说的事实: Child扩展Parent - 这意味着Child“是”Parent。
鉴于这在“现实世界”中没有意义 - 但是,它确实在您的代码中有意义 - 您正在向void测试(Parent p)方法提供Child对象 - 并且因为Child是父级 - 这就是调用System.out.println(“Parent”)的原因。