天天看点

Java重载方法

1.定义

重载方法是指拥有相同的方法名,不同签名的方法。

签名是指方法参数的个数和类型。

PS:仅仅返回值类型不同的方法不是重载方法。因为调用方法时不知道到底调用哪一个方法。

2.调用重载方法

2.1参数只有一个时

public class OverTest {
	void play(boolean i){
		System.out.println("调用了参数为boolean型的方法");
	}
	void play(char i){
		System.out.println("调用了参数为char型的方法");
	}
	void play(byte i){
		System.out.println("调用了参数为byte型的方法");
	}
	void play(short i){
		System.out.println("调用了参数为short型的方法");
	}
	void play(int i){
		System.out.println("调用了参数为int型的方法");
	}
	void play(long i){
		System.out.println("调用了参数为long型的方法");
	}
	void play(float i){
		System.out.println("调用了参数为float型的方法");
	}
	void play(double i){
		System.out.println("调用了参数为double型的方法");
	}
	public static void main(String[] args) {
		OverTest test=new OverTest();
		test.play('i');
	}

}
           

这时程序输出的结果是:

调用了参数为char型的方法

说明这是调用了参数为char型的方法,当我们把参数为char型的方法注释掉后会怎么样。

这时程序输出的结果是:调用了参数为int型的方法

说明这是调用了参数为int型的方法,为什么会这样呢?

当我们调用test.play('i')时,程序会去查找OverTest类中的play(char i)方法。当没有这个方法时,怎么办。

这时要用到隐式转换规则,程序会去查找char型可隐式转换成的最低级类型的play方法,若找到,就执行这个方法。

若找不到,程序会去查找char型可隐式转换成的次低级类型的play方法,以此类推,直到找到匹配的方法为止。

若到最后也没有找到,程序会报错。

PS:关于隐式转换规则可以参看我的这篇博文

当我们调用test.play(2014)时,会调用play(int i)方法。

当我们调用test.play(2014.11)时,会调用play(double i)方法。

因为整型默认为int型,浮点型默认为double型。

2.2参数有多个时

以2个参数为例。 还是会用到隐式转换准则,首先会查找两个参数完美匹配的方法。 若找不到,则会查找某一个参数完美匹配,另一个参数按照参数只有一个时的查找方法查找。 若还找不到,先将一个参数按照参数只有一个时的查找方法查找,一个参数匹配后再将另一个参数按照参数只有一个时的查找方法查找,直到找到匹配的方法为止。 若到最后也没有找到,程序会报错。

PS:参数查找时,两个参数实际上是没有先后顺序区别的。 若查找到两个方法,其中一个方法的第一个参数与调用方法的第一个参数匹配度比另一个方法高,而第二个参数与调用方法的第二个参数匹配度比另一个方法低。那么这时会产生二义性,程序会报错。 举例:

public class OverTest {
	void play(float i,double j){
		System.out.println("调用了参数为(float,double)型的方法");
	}
	void play(double i,float j){
		System.out.println("调用了参数为(double,float)型的方法");
	}
	public static void main(String[] args) {
		OverTest test=new OverTest();
		test.play(2014,11);
	}

}