一、重载Overload
多个方法有相同的名字、不同的参数,叫做重载。例如:
StringBuilder builder = new StringBuilder();
StringBuilder anotherBuilder = new StringBuilder("Hello World!");
此处StringBuilder类有两个不同的构造器,这两个构造器的参数个数不同,产生了重载。Java允许重载任何方法,而不只是构造器方法。要完整描述一个方法,需要指出方法名以及参数类型,叫做方法的签名(signature)。例如String类有4个方法名为indexOf的公有方法,它们的签名是:
indexOf(int)
indexOf(int, int)
indexOf(String)
indexOf(String, int)
注意:返回类型不是方法签名的一部分,因此不能有两个名字和参数类型相同,但返回类型不同的方法。
二、覆盖Override
若存在某个类Employee和一个派生于Employee的子类Manager,它们都有一个getSalary()方法,这两个方法的签名相同,此时形成覆盖:
class Employee {
...
private double salary;
...
public double getSalary() {
return salary;
}
...
}
class Manager extend Employee {
...
private double bonus;
...
// @Override声明该函数覆盖了父类的同名函数
@Override
public double getSalary() {
// return salary + bonus; // 错误。Manager类无法直接访问Employee类的private域salary
// return bonus + getSalary(); // 错误。会导致该函数无限调用它自身
return bonus + super.getSalary(); // 正确。super是指示编译器调用超类方法的特殊关键字
}
...
}
返回类型不是方法的签名的一部分,因此在覆盖方法时,要保证返回类型的兼容性。允许子类将覆盖方法的返回类型定义为原返回类型的子类型:
class Employee {
...
public Employee getBuddy() { ... }
...
}
class Manager extend Employee {
...
@Override
public Manager getBuddy() { ... } // Manager是Employee的子类,所以这里可以形成覆盖
...
}
注意:在覆盖一个方法的时候,子类方法不能低于超类方法的可见性。特别是若超类方法是public,子类方法一定要声明为public。