Java是根据参数类型和个数的不同实现重载。
1.当参数类型是基本类型,但不完全匹配。
void test(int i) { } void test(float f) { } public static void main(String[] args) { byte b = 1; test(b); }
这种情况,会选择哪一个?
以下分析基本数据类型之间的转换顺序:
public class test2 { public static void main(String[] args) { byte p1 = 1; char p2 = 1; short p3 = 1; int p4 = 1; long p5 = 1; float p6 = 1f; double p7 = 1d; param(p1); param(p2); param(p3); param(p4); param(p5); param(p6); param(p7); } public static void param(byte b) { System.out.println("byte"); } public static void param(char b) { System.out.println("char"); } public static void param(short b) { System.out.println("short"); } public static void param(int b) { System.out.println("int"); } public static void param(long b) { System.out.println("long"); } public static void param(float b) { System.out.println("float"); } public static void param(double b) { System.out.println("double"); } }
通过注释param方法,如注释byte参数的那个方法,看byte参数用哪个param方法。可以发现如下规律:
因此问题的答案是test(int i)。
2.当参数是引用类型
public class test2 { public static void main(String[] args) { superClass s = new superClass(); child c = new child(); Object o = new Object(); param(s); param(c); param(o); } public static void param(Object o) { System.out.println("object"); } public static void param(superClass o) { System.out.println("superClass"); } public static void param(child o) { System.out.println("child"); } } class superClass {} class child extends superClass {}
还是用上面的注释法,发现规律如下:
3.参数是包装类或可变参数
public class test2 { public static void main(String[] args) { int i = 10; param(i); } public static void param(Integer i) { System.out.println("Integer"); } public static void param(int... i) { System.out.println("int..."); } public static void param(long b) { System.out.println("long"); } public static void param(float b) { System.out.println("float"); } public static void param(Object o) { System.out.println("object"); } }
发现规律如下:
4.泛型
public class test2 { public static void main(String[] args) { test2 test = new test2(); child c = new child(); test.param(c); } public <T extends child> void param(T i) { System.out.println("<T extends child>"); } public void param(superClass o) { System.out.println("superClass"); } public <T> void param(T i) { System.out.println("<T>"); } }
可以发现规律:
总结:顺序为
原因:越上面的出现在JDK时间越晚。