欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
    }
}