·方法的重载
Test类中有如下void max(int a, int b)方法用于打印出两个int类型的数中最大的数,但如果实参为float类型或double类型,该方法就不可用了。
class Test {
void max(int a, int b) {
System.out.println(a > b ? a : b);
}
}
于是添加了两个方法如下:
class Test {
void max(int a, int b) {
System.out.println(a > b ? a : b);
}
void maxFloat(float a, float b) {
System.out.println(a > b ? a : b);
}
void maxDouble(double a, double b) {
System.out.println(a > b ? a : b);
}
}
每次需要根据传入的数来确定方法名,这显然太过麻烦,可以使用方法的重载解决这个问题:
class Test {
void max(int a, int b) {
System.out.println(a > b ? a : b);
}
void maxFloat(float a, float b) {
System.out.println(a > b ? a : b);
}
void maxDouble(double a, double b) {
System.out.println(a > b ? a : b);
}
}
方法的重载是指一个类中可以定义有相同名字,但参数不同的多个方法。调用方法时,会根据不同的参数表选择对应的方法。
程序会根据test.max(3, 4)或test.max(2.8, 5.2)来选择调Test类中不同的max方法。
假如需要比较short类型数据的大小,还可以进一步添加short类型数据的max方法:
class Test {
void max(int a, int b) {
System.out.println(a > b ? a : b);
}
void max(short a, short b) {
System.out.println(a > b ? a : b);
}
void max(float a, float b) {
System.out.println(a > b ? a : b);
}
void max(double a, double b) {
System.out.println(a > b ? a : b);
}
public static void main(String[] args) {
Test test = new Test();
test.max(3, 4);
}
}
请问test.max(3, 4);是调用的哪一个max方法?short的还是int的?
之前说过,当发生方法重载时,程序会根据实参来判断调用哪一个方法,这里的3和4默认情况是int类型,因此调用的是void max(int a, int b)这个方法,那么要调用void max(short a, short b)方法只要传入的是两个short类型的变量即可:
class Test {
void max(int a, int b) {
System.out.println(a > b ? a : b);
}
void max(short a, short b) {
System.out.println(a > b ? a : b);
}
void max(float a, float b) {
System.out.println(a > b ? a : b);
}
void max(double a, double b) {
System.out.println(a > b ? a : b);
}
public static void main(String[] args) {
Test test = new Test();
short a = 3;
short b = 4;
test.max(a, b); //调用的是void max(short a, short b)方法
}
}
对于如下情况的两个max方法并不构成重载,由于可以不接收带返回值方法的返回值,在直接调用test.max(3, 4)方法时,程序无法得知要调用的到底是哪一个max方法,因此程序会出错,故不构成方法重载。
class Test {
void max(int a, int b) {
System.out.println(a > b ? a : b);
}
int max(int a, int b) {
return a > b ? a : b;
}
}
一句话,方法名相同的一些方法,在被调用能够与别的方法区分开而不至于出现混淆的情况,那么这样的方法互相之间构成重载。
· 构造方法的重载
与普通方法一样,构造方法也可以重载,如下所示:
public class Test {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Perosn(2);
Person p3 = new Person(3, 40);
}
}
class Person {
int id;
int age;
Person() {
id = 1;
age = 20;
}
Person(int _id) {
id = _id;
age = 30;
}
Person(int _id, int_age) {
id = _id;
age = _age;
}
}