Java Method Overloading 方法重载 VS Method Overiding 方法重写

更多 Java 基础知识方面的文章,请参见文集《Java 基础知识》


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

你可能感兴趣的:(Java Method Overloading 方法重载 VS Method Overiding 方法重写)