重载的定义
-
在同一个类中
-
允许存在一个以上的同名方法,只要他们的参数个数、参数类型或参数顺序不同即可
重载的特点
- 只看参数列表,且参数列表必须不同
参数列表不同指的是:参数个数或参数类型
- 调用时,根据方法参数列表的的不同来区别
方法重载可以方便同一类方法承载不同的参数和数据类型,例如System.out.println()
注意事项:
-
权限修饰符、返回值、抛出异常不同不能称为方法重载,甚至在编译期就会报错
-
继承中不存在重载,虽然可以定义类似于重载的方法,但是实际逻辑如下图
重载示例
class Person{
String name;
int age;
double high;
String hobby;
public Person(){
System.out.println("构造器初始化");
}
public void show(){
System.out.println("我是show");
}
//针对show方法的这种写法,我们称为重载
public void show(String name){
System.out.println("我是show:"+name);
}
}
重载详解
-
重载可以看作是比较方法名和方法参数列表的过程,这种比较只能发生在一个类中。
-
当出现继承关系的时候,我们会发现,可以像下面红色部分代码一样的写法,很多人都会误以为是重载
class Car{ public void show() { System.out.println("小车"); } public void play(){ System.out.println("我是父类的play"); } } class Bwm extends Car{ //重写 @Override public void show() { System.out.println("宝马"); } //属于一个新方法 public void play(int a){ System.out.println("我是子类的play"); } }
-
继承关系中子类重新写一个父类的方法,但是参数列表不一样的为什么不属于重载?
-
ClassLoader在加载类模板的时候是独立加载的,在这个过程中,由于是独立进行的,实际就可以看作是两个类在进行各自的加载,extends会对这两个类进行关联
-
在创建子类对象后,调用play方法,会现在子类中查找,再去父类查找
-
在创建父类对象后,调用play方法,会直接在父类中查找,都没办法进入子类
-
重载中Java编译器会根据方法签名判断哪个方法应该被调用,直接调用该方法。
-
实践理解重载
public class TestMax {
/** 主方法 */
public static void main(String[] args) {
int i = 5;
int j = 2;
int k = max(i, j);
System.out.println( i + " 和 " + j + " 比较,最大值是:" + k);
}
/** 返回两个整数变量较大的值 */
public static int max(int num1, int num2) {
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
}
此时上述代码中max
方法仅仅适用于int型数据。
提出问题:如果想得到两个浮点类型数据的最大值,但是又不想修改方法名(因为业务都一样,都是为了求最大值)
解决问题:解决方法是创建另一个有相同名字但参数不同的方法,如下面代码所示:
public static double max(double num1, double num2) {
if (num1 > num2)
return num1;
else
return num2;
}
如果你调用max方法时传递的是int型参数,则 int型参数的max方法就会被调用;
如果传递的是double型参数,则double类型的max方法就会被调用
上述的例子就叫做方法重载,方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。
对比重写参考:Java重写