一、基本概念
Java方法的重载必须满足以下条件:
1.方法名相同;
2.方法参数类型、顺序或个数不同,且至少有一个参数不同;
3.方法的返回值类型可以不同;
4.只有访问权限或final修饰符不同的方法是不允许重载的。
可以通过下面的示例来理解Java方法重载的概念:
public class Person { public void speak() { System.out.println("这是不带参数的speak方法"); } public void speak(int times) { System.out.println("这是带一个int类型参数的speak方法,说话" + times + "遍"); } public void speak(String word) { System.out.println("这是带一个String类型参数的speak方法,说话内容为:" + word); } public String speak(String word, int times) { System.out.println("这是带一个String类型和一个int类型参数的speak方法,说话内容为:" + word + ",说话" + times + "遍"); return "speak方法返回值"; } }
在上面的代码中,我们定义了4个名称相同的方法,但它们的参数列表却不同,这就是Java方法重载的实现方式。
二、方法调用顺序
Java编译器如何判断哪个方法应该被调用呢?这里我们需要了解Java中方法调用的顺序。
编译器在调用方法时,首先会寻找与方法名相匹配的方法,并检查其参数列表。如果没有找到匹配的方法,则编译器会递归的寻找基本类型的子类型,来查找是否有合适的方法。若还是找不到方法,则编译器会抛出错误。
例如,在以下的代码中,该如何判断调用哪个方法呢?
public class MethodOverload { public void test(int i) { System.out.println("我是test(int i)方法" + i); } public void test(Integer i) { System.out.println("我是test(Integer i)方法" + i); } public static void main(String[] args) { MethodOverload obj = new MethodOverload(); obj.test(1); } }
对于obj.test(1)的调用,根据Java方法调用的顺序,编译器首先会寻找test(int i)方法,因为1是int类型的参数;当然,如果你将1写成new Integer(1),编译器将会优先使用test(Integer i)方法。因为包装类型也是一种类型。
三、重载与覆盖
在Java中,方法的重载和覆盖是两个不同的概念。
方法的覆盖是指子类重写父类的方法,子类已经存在一个与父类中同名、同参的方法,这时,父类的这个方法就会被子类所覆盖,当我们执行子类的该方法时,实际上是执行子类中的方法,而不是父类中的方法。
方法覆盖要求方法的名称、参数列表都相同,而且返回值类型和访问修饰符必须完全一致,否则就不是方法的覆盖,也不会出现多态性。方法覆盖主要用于实现多态性。
与之不同的是,方法重载是在同一个类中定义几个名称相同的方法,但是它们必须有不同的参数列表(类型、顺序、个数)或者在上文所说返回值类型与访问修饰符必须不同。
四、注意事项
在Java方法的重载时,有几个需要注意的地方:
1.不同的访问权限和修饰符不影响方法重载;
2.在方法重载时,返回值类型不能作为重载方法的区分标志;
3.在方法重载时,参数名称也不影响方法重载;
4.方法参数类型只能是Java中的基本数据类型和引用数据类型,不能使用基本数据类型的不同包装类型作为参数的类型进行重载。
五、总结
Java中方法重载是Java的一项重要特性。重载可以让代码更具有可读性和复用性,便于编程更加灵活。在重载时,需要注意参数类型、顺序和个数等的变化,同时也需要注意返回值类型和限定符不能作为重载方法的区分标志。
下面是一段简单的重载代码示例:
public class Calculation { public int calculate(int a, int b) { return a + b + 5; } public int calculate(int a, int b, int c) { return a * b * c; } public double calculate(double a, double b) { return a / b; } public static void main(String[] args) { Calculation obj = new Calculation(); System.out.println(obj.calculate(1, 2)); System.out.println(obj.calculate(1, 2, 3)); System.out.println(obj.calculate(3.0, 2.0)); } }
在上面的代码中,calculate方法被重载了,我们可以通过参数个数、类型以及返回值的不同,来实现不同的计算方式。