8.3.2 分派

  1. /**
  2. * @author study
  3. * @version 1.0
  4. * 方法静态分派演示
  5. * @date 2021/6/24 16:43
  6. */
  7. public class StaticDispatch {
  8. static abstract class Human{}
  9. static class Man extends Human{}
  10. static class Woman extends Human{}
  11. public void sayHello(Human guy){
  12. System.out.println("hello,guy!");
  13. }
  14. public void sayHello(Man guy){
  15. System.out.println("hello,lentleman!");
  16. }
  17. public void sayHello(Woman guy){
  18. System.out.println("hello,lady!");
  19. }
  20. public static void main(String[] args) {
  21. Human man =new Man();
  22. Human woman = new Woman();
  23. final StaticDispatch sr = new StaticDispatch();
  24. sr.sayHello(man);//hello,guy!
  25. sr.sayHello(woman);//hello,guy!
  26. }
  27. }

虚拟机为何选择执行参数类型为Human作为重载?

Human man = new Man(); 我们把上面代码中的“Human”称为变量的“静态类型”或者叫做“外观类型”。后面的”Man” 则称为变量的实际类型或者叫做“运行时类型”。静态类型和实际类型在程序中都可能会发生变化,区别是静态类型的变化仅仅在使用时发生,变量本身的静态类型不会改变,并且最终的静态类型是在编译器可知的;而实际类型变化的结果在运行期才可确定,编译器在编程程序的时候并不知道一个对象实际类型是什么。