重写发生在子类和父类中。当子类对父类提供的方法不满意的时候,要对父类的方法进行重写。子类的方法名字和父类必须一致,参数列表(个数,类型,顺序)也要和父类一致。
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
。 -
返回值:重写的返回值类型要求父类的返回值类型大于等于子类。这里有几种情况:
- 返回值是基本数据类型时,子类重写方法必须和父类方法的返回值类型相同
- 返回值是引用数据类型时,子类重写方法返回的类型应该是父类方法返回的类型或者其子类
这里额外需要注意的一点是:父类中的静态方法不能被重写,如果子类也有相同的方法,并不是重写的父类的方法,而是将父类同名的方法隐藏了起来。