Java Method Overloading 方法重载 VS Method Overiding 方法重写
程序员文章站
2022-07-15 13:04:50
...
Method Overloading 方法重载
- 方法使用相同的名字,不同的参数
- 不能只改变返回值类型
- 目的:增加代码可读性
main 方法也可以重载,例如:
public class Main_Test {
// 只有这个 main 方法会被 JVM 自动执行
public static void main(String[] args) {
main(123);
}
// 只有这个 main 方法不会被 JVM 自动执行
// 相当于一个普通的静态方法,可以被调用
public static void main(int i) {
System.out.println(i);
}
}
Method Overiding 方法重写
- 子类继承父类,同样的方法签名,不同的方法实现
- 目的:运行时绑定,运行时多态
不能 Override 静态方法,因为静态方法属于类 Class,在 Class Area,是静态绑定,在编译期决定。
关于 Override 静态方法,参见 Java 域隐藏 Field Hiding 及静态方法隐藏 Method Hiding
Covariant Return Type
如果子类的方法与父类的方法拥有相同的方法名和参数,即使返回值类型不同(即方法签名不同),但是如果子类方法返回值类型是父类方法返回值类型的子类型,也属于Method Overiding 方法重写,属于运行时绑定,运行时多态。
例如下面例子中:
Base 的方法 f() 与 Derived 的方法 f() 拥有相同的方法名和参数,但是:
- 返回值类型不同,一个是 Number,一个是 Integer,所以方法签名不同
- 由于 Number 是 Integer 的父类,因此仍然属于Method Overiding 方法重写,属于运行时绑定,运行时多态。
public class CovariantReturnType_Test {
public static void main(String[] args) {
Base b = new Derived();
b.f(); // 输出Derived
}
}
class Base {
public Number f() {
System.out.println("Base");
return 1;
}
}
class Derived extends Base {
public Integer f() {
System.out.println("Derived");
return 1;
}
}