所有依赖静态类型来定位方法的执行版本的分派动作成为静态分派,静态分派典型的应用场景是方法的重载。在编译阶段,javac编译器会根据参数的静态类型决定使用哪个重载版本,但很多种情况下这个版本并不是“唯一的”,往往只能确定一个“更加合适的”版本。
public class Main { public static void sayHello(Object arg) { System.out.println("hello object"); } public static void sayHello(int arg) { System.out.println("hello int"); } public static void sayHello(long arg) { System.out.println("hello long"); } public static void sayHello(Character arg) { System.out.println("hello Character"); } public static void sayHello(char arg) { System.out.println("hello char"); } public static void sayHello(char... arg) { System.out.println("hello char..."); } public static void sayHello(Serializable arg) { System.out.println("hello Serializable"); } public static void main(String[] args) { sayHello('c'); } }
方法重载的优先级为:
hello char hello int hello long hello Character hello Serializable hello Object hello char...
之所以会匹配到Serializable是因为它是Character实现的一个接口,由上可见变长参数的重载优先级是最低的。