所有依赖静态类型来定位方法的执行版本的分派动作成为静态分派,静态分派典型的应用场景是方法的重载。在编译阶段,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实现的一个接口,由上可见变长参数的重载优先级是最低的。

posted on 2017-10-13 10:43  FreeAngryBird  阅读(127)  评论(0编辑  收藏  举报