ITEEDU

Java Gossip: 重载(Overload)方法

Java支持方法「重载」(Overload),又有人译作「超载」、「过载」,这种机制为类似功能的方法提供了 统一的名称,但是根据参数列型态的不同,而自动呼叫对应的方法。

一个例子可以从 java.lang.String 类别上提供的所有方法看到,像是它的valueOf()方法就提供了多个版本:

  • static String valueOf(boolean b)
  • static String valueOf(char c)
  • static String valueOf(char[] data)
  • static String valueOf(char[] data, int offset, int count)
  • static String valueOf(double d)
  • static String valueOf(float f)
  • static String valueOf(int i)
  • static String valueOf(long l)
  • static String valueOf(Object obj)

虽然呼叫的方法名称都是valueOf(),但是根据所传递的自变量数据型态不同,您可以呼叫不同版本的方法来进行对应的动作。

方法重载的功能使得程序设计人员能较少苦恼于方法名称的设计,以统一的名称来呼叫相同功能的方法,方法重载不仅可根据传递自变量的数据型态不同来呼叫对应的 方法,参数列的参数个数也可以用来设计方法重载。

方法重载时可以根据方法参数列的数据型态,也可以根据参数的个数,不过必须注意的是,方法重载不可根据传回值的不同来区别。

方法重载当被使用于对象导向设计时的建构方法的使用时,提供对象生成时不同的建构方法,或者是使用于对象所提供的同名方法,但多样化的参数设定方式。

J2SE 5.0 后,当您使用方法重载时,要注意到 autoboxing、 unboxing 的问题,来看看下面的程序片段,您认为结果要是什么?

Test.java
public class Test {
	public static void main(String[] args) {
		someMethod(1);
	}
	public static void someMethod(int i) {
		System.out.println("i");
	}
	public static void someMethod(Integer integer) {
		System.out.println("integer");
	}
}

结果必须是显示 "i",您不能期待装箱(boxing)的动作会发生,如果您想要呼叫自变量列为Integer版本的方法,您要明确指定:

someMethod(new Integer(1));

编译器在处理重载与装箱问题时,会依以下的顺序:

  1. 找寻在还没有装箱动作前可以符合的方法
  2. 第一步失败的话,尝试装箱动作后可以符合的方法
  3. 第二步也失败,尝试有装箱及有 不 定长度自变量 的方法
  4. 第三步也失败,编译器找不到合适的方法,回报编译错误