重载 (Overload)允许不同的方法有相同的名称,但不同的签名(signatures),其中签名可以是不同的输入参数数量或者不同的输入参数类型。重载与编译时(或静态)多态相关。
// Java program to demonstrate working of method
// overloading in Java.
public class Sum {
// Overloaded sum(). This sum takes two int parameters
public int sum(int x, int y) {
return (x + y);
}
// Overloaded sum(). This sum takes three int parameters
public int sum(int x, int y, int z) {
return (x + y + z);
}
// Overloaded sum(). This sum takes two double parameters
public double sum(double x, double y) {
``` return (x + y);
}
// Driver code
public static void main(String args[]) {
Sum s = new Sum();
System.out.println(s.sum(10, 20));
System.out.println(s.sum(10, 20, 30));
System.out.println(s.sum(10.5, 20.5));
}
}
输出:
30
60
31.0
多态的好处都有啥?
我们不必为了处理相同任务的方法起更多的名称,类似于上面的代码,我们不用起诸如 sumInt, sumDouble,...,sumInt3,...之类的各种名称。
返回值类型能否重载?
答案是 No,这点和 C++ 是相同的,例如:
public class Main {
public int foo() {
return 10;
}
// compiler error: foo() is already defined
public char foo() {
return 'a';
}
public static void main(String args[]) {
}
}
静态方法能否重载?
答案是 Yes,一个类可以有多个名称相同参数不同的静态方法。可以参考详情。
Main() 方法能否重载?
和静态方法重载一样,答案是可以的。
// A Java program with overloaded main()
import java.io.*;
public class Test {
// Normal main()
public static void main(String[] args) {
System.out.println("Hi Geek (from main)");
Test.main("Geek");
}
// Overloaded main methods
public static void main(String arg1) {
System.out.println("Hi, " + arg1);
Test.main("Dear Geek","My Geek");
}
public static void main(String arg1, String arg2) {
System.out.println("Hi, " + arg1 + ", " + arg2);
}
}
输出:
Hi Geek (from main)
Hi, Geek
Hi, Dear Geek, My Geek
Java 是否允许操作符(Operator)重载?
与C++不同,Java 不允许自定义重载操作符。Java 内部允许重载操作符,如 + 被用于连接字符串。
重载(Overload)和重写(Override)的区别?
重载是有相同功能的方法有不同的签名,重写两个方法可能有相同的功能,相同的签名,但是需要不同的类通过继承连接。
OverridingVsOverloading.png
重载是编译时多态,重写是运行时多态。