1. 什么是方法分派?
就是确定调用谁的,哪个方法。
在Java中子类覆写父类方法的方法都是虚方法,使用final、private修饰的方法不是虚方法。
2. 方法分派情况分析
在Java中子类继承父类并覆写父类方法,在调用时取决于运行时的实际类型。
// 父类 public class SuperClass { public String getName() { return "super"; } } // 子类 public class SubClass extends SuperClass { @Override public String getName() { return "sub"; } } // 实现 public class LearnJava { public static void main(String[] args) { SuperClass superClass = new SubClass(); printClass(superClass); } public static void printClass(SuperClass superClass) { System.out.println("super class: " + superClass.getName()); } public static void printClass(SubClass subClass) { System.out.println("sub class: " + subClass.getName()); } }
输出:
super class: sub
调用过程是怎么样的?
在编译时期需要确定方法的调用,在main()函数中在编译时确认调用printClass(SuperClass superClass)方法,在printClass(SuperClass superClass)方法中调用哪个getName()方法,是父类的还是子类的,取决于运行时实际类型。所以,在main中调用printClass(SuperClass superClass),在printClass(SuperClass superClass)方法中superClass实际类型是SubClass,所以调用SubClass类实例的getName()方法。
3. 方法分派总结
1. 静态分派 -- 方法重载分派
1. 编译时;
2. 依据调用者的声明类型与方法参数类型;
2. 动态分派 -- 方法覆写分派
1. 运行时;
2. 依据调用者的实际类型;