【转载自本科老师上课课件】
调用一个重载过的方法时,Java编译程序是如何确定究竟应该调用哪一个方法?以下代码定义了三个重载方法:
public void f(char ch){ System.out.println(“char!”); } public void f(short sh){ System.out.println(“short!”); } public void f(float f){ System.out.println(“float!”); }
当调用语句 f((byte)65); 时,到底调用的是上述哪一个方法?
这个问题其实就是在“方法调用时发生的类型转换”,即在方法调用上下文中产生的类型转换。其类型转换是按“基本数据类型宽转换”进行。若“宽转换”不成功,再进行“装箱”和“拆箱”类型转换。
按“宽转换”,byte可自动转换成short或float,但short比float更特殊。特殊的含义是:short能够宽转换到float,反之不行。故最终调用的是方法:public void f(short sh){…};
再如:
public void f(Object o){…} public void f(int[] ia){…}
当调用语句 f(null); 时,应调用哪一个方法?
由于空引用null可自动转换到int[]类型,也可自动转换到Objec类型。但int[]数组类型更特殊(即:int[]数组类型是一个Object类型,但Object不是int[]数组),故最终调用的是f(int[] ia)方法。