重写发生在子类和父类中。当子类对父类提供的方法不满意的时候,要对父类的方法进行重写。子类的方法名字和父类必须一致,参数列表(个数,类型,顺序)也要和父类一致。

public class Person {
    public void eat(){
        System.out.println("吃食物");
    }
}
public class Student extends Person {
    @override
    public void eat(){
        System.out.println("吃小龙虾");
    }
}
public class Test {
    public static void main(String[] args) {
        Student s = new Student();
        s.eat(); // 吃小龙虾
    }
}

重写和重载听起来仅有一字之差,但却截然不同。具体的比较可以参考下表:

位置 修饰符 返回值 方法名 参数 抛出异常 方法体
重载overload 同一个类中 无关 无关 必须相同 必须不同 无关 不同
重写override 子类父类中 子类的不能比父类的更严格 父类的返回值类型大于等于子类 必须相同 必须相同 小于等于 不同

表中大部分都不需要额外解释,这里主要解释两个:

  • 修饰符:重写的修饰符要求子类的不能比父类的更严格,这里需要知道四个修饰符的访问权限大小依次排列为 public > protected > default > private ,即如果父类方法的修饰符为 protected ,则子类重写的修饰符为 public

  • 返回值:重写的返回值类型要求父类的返回值类型大于等于子类。这里有几种情况:

    • 返回值是基本数据类型时,子类重写方法必须和父类方法的返回值类型相同
    • 返回值是引用数据类型时,子类重写方法返回的类型应该是父类方法返回的类型或者其子类

这里额外需要注意的一点是:父类中的静态方法不能被重写,如果子类也有相同的方法,并不是重写的父类的方法,而是将父类同名的方法隐藏了起来。