首先,我们先看下下面这段简单的代码:
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.