使用Parent和Child类作为参数重载的方法

时间:2014-06-12 15:40:29

标签: java inheritance polymorphism overloading

我有3个课程GrandParentParentChild,其中 Child extends ParentParent 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个对象都调用了不同的方法。其中一个是编译时和其他运行时绑定。这对我来说听起来很奇怪。你怎么解释这个?

3 个答案:

答案 0 :(得分:8)

方法重载是编译时多态。

方法覆盖是运行时多态性。

在您的情况下,您正在重载类Main的两个实例方法。

但是,由于我在您的上下文中假定Child扩展Parentnew 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”)的原因。