文章参考: https://blog.csdn.net/ns_code/article/details/17965867
- public class StaticDispatch {
- static abstract class Humnan {
- }
- static class Man extends Humnan {
- }
- static class Woman extends Humnan {
- }
- public void hello(Humnan guy) {
- System.out.println("hello, Humnan");
- }
- public void hello(Man guy) {
- System.out.println("hello, Man");
- }
- public void hello(Woman guy) {
- System.out.println("hello, Woman");
- }
- public static void main(String[] args) {
- Humnan man = new Man();
- Humnan woman = new Woman();
- StaticDispatch dispatch = new StaticDispatch();
- dispatch.hello(man);
- dispatch.hello(woman);
- }
- }
这段代码的运行结果是:
- hello, Humnan
- hello, Humnan
这是静态分派机制
所有依赖静态类型来定位方法执行版本的分派动作, 都称为静态分派, 静态分派的最典型应用就是多态性中的方法重载. 静态分派发生在编译阶段, 因此确定静态分配的动作实际上不是由虚拟机来执行的
Human man = new Man();
上面代码中的 "Human" 称为变量的静态类型, 后面的 "Man" 称为变量的实际类型. 静态类型和实际类型在程序中都可以发生一些变化, 区别是静态类型的变化仅仅在使用时发生, 变量本身的静态类型不会被改变, 并且最终的静态类型是在编译期可知的, 而实际类型变化的结果在运行期才可确定.
在调用 hello()方法时, 方法的调用者都为 dispatch 的前提下, 使用哪个重载版本, 完全取决于传入参数的数量和数据类型 (方法的参数也是数据宗量). 代码中刻意定义了两个静态类型相同, 实际类型不同的变量, 可见编译器(不是虚拟机, 因为如果是根据静态类型做出的判断, 那么在编译期就确定了) 在重载时是通过参数的静态类型而不是实际类型作为判定依据的. 并且静态类型是编译期可知的, 所以在编译阶段, Javac 编译器就根据参数的静态类型决定使用哪个重载版本. 这就是静态分派最典型的应用
来源: http://www.bubuko.com/infodetail-3394809.html