虚拟机字节码执行引擎随记(一)方法重载与静态分派的关系

首先,我们先看下下面这段简单的代码:

    static abstract class Human {
    }

    static class Man extends Human {
    }

    static class Woman extends Human {
    }

    public void say(Human human) {
        System.out.println("Human say.");
    }

    public void say(Man man) {
        System.out.println("Man say.");
    }

    public void say(Woman woman) {
        System.out.println("Woman say.");
    }

类Man和类Woman是Human类的子类。方法say有根据参数的不同有三个输出结果不同重载版本。

现在,运行这样一段程序,读者可以思考下会输出什么?

    public static void main(String[] args) {
        Draft draft = new Draft();

        Human man = new Man();
        Human woman = new Woman();

        draft.say(man);
        draft.say(woman);
    }

答案是:

原理:

Human man = new Man();
Human woman = new Woman();

上面这两行代码中,Human称为变量的静态类型(外观类型),Man和Woman称作变量的实际类型。变量的静态类型是在编译期就可知的,而实际类型则需要到运行期才能确定。

在重载时,是通过参数的静态类型(外观类型)来判断使用哪一个重载方法。

所以就会出现两次调用say方法输出的都是Human say.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章