Java的重载以及与重写的区别
一、什么是方法重载
方法的重载就是在同一个类中,有着若干个名字相同的方法。在具体调用这些方法的时候,通过传递参数的不同来调用这些重载方法。
二、为什么需要方法重载
- 方法名的定义需要做到见名知意,功能类似的方法一定程度上注定了方法名的相同,重载的使用有好的解决了这种因见名知意带来的方法名冲突。
- 重载可以提高代码的可读性和可维护性。方法名相同的方法在一起能够清晰知道每一个方法的区别,提高代码可读性,也方便后期的代码维护。
三、方法重载的规则
- 方法名必须相同
public static int add(int a){ return a+1; } public static int add(int a,int b){ return a+b; } public static int add(int a,int b,int c){ return a+b+c; }
方法名必须相同,比如这里的add()方法,如果第二个add()方法改成add2()那就不是方法重载了。
- 方法的参数列表必须不相同。(方法的参数列表包括方法的参数个数以及参数类型和参数顺序)
-
参数个数不相同,还是上面代码:
public class Myclass { public static int add(int a){ return a+1; } public static int add(int a,int b){ return a+b; } public static int add(int a,int b,int c){ return a+b+c; } public static void main(String[] args) { System.out.println(add(1)); System.out.println(add(1,2)); System.out.println(add(1,2,3)); } }
运行结果如下:
2 3 6
-
参数类型不相同
public class Myclass { public static void add(int a,int b){ System.out.println(a+b); } public static void add(double a,double b){ System.out.println(a+b); } public static void main(String[] args) { add(1,2); add(1.2,2.3); } }
运行结果:
3 3.5
这里的参数不同,一个是int类型的参数,一个是double类型的参数,满足重载的条件
-
参数顺序不同也可以满足重载
public class Myclass { public static double add(double b,int a){ return a+b; } public static double add(int a,double b){ return a*b; } public static void main(String[] args) { System.out.println(add(1.2,2)); System.out.println(add(2,2.0)); } }
运行结果:
3.2 4.0
这里对参数顺序进行调换位置,编译器依旧能够找到对应的方法。
- 方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错,这叫做重载分辨。
-
参数个数不相同,还是上面代码:
四、方法重载的注意事项
- 方法的返回类型可以相同也可以不相同。
这里让参数保持一致,改变方法类型。根据IDEA提示发现无法在参数一致的时候通过方法返回类型来进行方法重载
当适当的改变方法参数,代码如下,编译通过。
public class Myclass { public static int add(int a,int b){ return a+b; } public static double add(int a,double b){ return a+b; } public static void main(String[] args) { System.out.println(add(1,2)); //输出3 System.out.println(add(1,2.0)); //输出3.0 } }
由上可知,方法重载的关键是在参数列表上,仅仅返回类型不同不足以称为方法的重载,方法的返回类型可以相同也可以不相同。
- 方法的修饰符并不影响方法的重载。
我们改变上例中方法的修饰符。结果正常输出:public class Myclass { public static int add(int a,int b){ return a+b; } static double add(int a,double b){ return a+b; } public static void main(String[] args) { System.out.println(add(1,2)); //输出3 System.out.println(add(1,2.0)); //输出3.0 } }
- main方法也可以被重载。
public class Myclass { public static void main(String name) { System.out.println(name+"你好"); } public static void main(String[] args) { main("ThreePure"); } }
main方法可以重载,只不过虚拟机只调用带字符串公共类型的main方法,public static void main(String[] args){}。
五、方法重载与方法重写的区别
重载 | 重写 | |
相同 | 方法名称相同 | |
英文 | Overloading | Overiding |
范围 | 同一个类 | 继承中的子类 |
区别 | 需要参数列表不同 | 只有方法体不同,方法列表也必须相同 |
其他要求 | 对修饰符,返回值类型没有特殊要求 | 对权限等其他都有特定要求 |
区别重载和重写的最好的判断方法就是是否出现在继承中,以及参数列表是否必须完全相同。