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

Lea*_*ner 8 java polymorphism inheritance overloading

我有3个班GrandParent,ParentChild,其中 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,2调用test()方法都用Child对象调用不同的方法.其中一个是编译时和其他运行时绑定.这对我来说听起来很奇怪.你会怎么解释这个?

Men*_*ena 8

方法重载是编译时多态.

方法重写是运行时多态性.

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

但是,因为我在你的上下文中推测Child扩展Parent,new Child() instanceof Parent == true因此一个实例Childtest带有参数类型的方法的有效参数Parent.

在第一种情况下,您GrandParent在方法中传递引用类型test,并找到确切的类型.

在第二种情况下,您Child在方法中传递引用类型test.最近的匹配是Parent,因此test(Parent p)被调用.