有些朋友很容易把方法重载(Overload)和方法重写(Override)搞混了,其实二者放在一起相比没有什么意义。方法重载主要发生在同一个类中的多个同名方法之间;而方法重写是发生在父类和子类的同名方法之间。
方法重载
Java支持一个类中可以有多个同名的方法,只要形参列表不同即可。如果一个类中包含了两个或两个以上的同名方法,但形参列表不同,则被称为方法重载。
例如:
public class Overload {
public void test()
{
System.out.println("无参数");
}
public void test(String msg)
{
System.out.println("重载,参数:" + msg);
}
public static void main(String[] args) {
Overload ol = new Overload();
// 调用方法时,系统根据传入的实参列表进行匹配
ol.test();
ol.test("hello");
}
}
方法重写
方法重写是发生在父类和子类的同名方法之间。比如有一个Bird类其中有一个fly()方法。Ostrich类继承了Bird类,但鸵鸟是不会飞的,因此应该重写该fly()方法。这种子类包含父类同名方法的现象被称为方法重写(Override),也被称为方法覆盖。
方法重写要遵循**“两同两小一大”**的原则,“两同”即方法名相同、形参列表相同;“两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等、子类方法声明抛出的异常类应比父类方法声明跑出的异常类更小或相等;“一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。值得指出的是,覆盖方法和被覆盖方法要么都是类方法(即static修饰),要么都是实例方法,不能一个是类方法,一个是实例方法。不然将会引发编译错误。
当子类覆盖了父类方法后,如果需要访问父类中被覆盖的方法,则可以使用super(被覆盖的是实例方法)或类名(被覆盖的是类方法)来作为调用者调用父类中被覆盖的方法。