重载:两同一不同 两同:两个方法在同一个类中 ,两个方法同名 一不同:两个方法的参数列表不同
假设有这样一个类
1 public class TestWhichMethodIsUsed { 2 3 public static void testMethod(List<?> list) 4 { 5 System.out.println("1-------------"); 6 } 7 public static void testMethod(ArrayList<?> arrayList) 8 { 9 System.out.println("2-------------"); 10 } 11 public static void testMethod(LinkedList<?> linkedList) 12 { 13 System.out.println("3-------------"); 14 } 15 16 public static void main(String[] args) 17 { 18 List<String> list1 = new ArrayList<String>(); 19 TestWhichMethodIsUsed.testMethod(list1); 20 List<String> list2 = new LinkedList<String>(); 21 TestWhichMethodIsUsed.testMethod(list2); 22 } 23 24 }
可能你会期望打印的是“2-------------”和“3-----------”,但是两条打印的都是“1-----------”;
这是因为程序对于重载方法的选择是静态的,也就是根据传入参数的编译时类型来选择使用哪个重载的方法;而对于重写的方法,
的选择是动态的,也就是根据调用者的运行时类型,来选择使用哪个方法。也就是对于重载方法的选择是在编译时进行的,对于
重写方法的选择是在运行时进行的。详细的涉及的关于分派的知识参见《深入理解Java虚拟机》8.3.2节。