CSDN 的小伙伴们,大家好,我是沉默王二。
重写(Overriding)算是 Java 中一个非常重要的概念,理解重写到底是什么对每个 Java 程序员来说都至关重要,这篇文章就来给大家说说重写过程中应当遵守的 12 条规则。
01、什么是重写?
重写带来了一种非常重要的能力,可以让子类重新实现从超类那继承过来的方法。在下面这幅图中,Animal 是父类,Dog 是子类,Dog 重新实现了 move() 方法用来和父类进行区分,毕竟狗狗跑起来还是比较有特色的。
重写的方法和被重写的方法,不仅方法名相同,参数也相同,只不过,方法体有所不同。
02、哪些方法可以被重写?
规则一:只能重写继承过来的方法。
因为重写是在子类重新实现从父类继承过来的方法时发生的,所以只能重写继承过来的方法,这很好理解。这就意味着,只能重写那些被 public、protected 或者 default 修饰的方法,private 修饰的方法无法被重写。
Animal 类有 move()、eat() 和 sleep() 三个方法:
public class Animal {
public void move() { }
protected void eat() { }
void sleep(){ }
}
Dog 类来重写这三个方法:
public class Dog extends Animal {
public void move() { }
protected void eat() { }
void sleep(){ }
}
OK,完全没有问题。但如果父类中的方法是 private 的,就行不通了。
public class Animal {
private void move() { }
}
此时,Dog 类中的 move() 方法就不再是一个重写方法了,因为父类的 move() 方法是 private 的,对子类并不可见。
public class Dog extends Animal {
public void move() { }
}
03、哪些方法不能被重写?
规则二:final、static 的方法不能被重写。
一个方法是 final 的就意味着它无法被子类继承到,所以就没办法重写。
public class Animal {
final void move() { }
}
由于父类 Animal 中的 move() 是 final 的,所以子类在尝试重写该方法的时候就出现编译错误了!
同样的,如果一个方法是 static 的,也不允许重写,因为静态方法可用于父类以及子类的所有实例。
public class Animal {
final void move() { }
}
重写的目的在于根据对象的类型不同而表现出多态,而静态方法不需要创建对象就可以使用。没有了对象,重写所需要的“对象的类型”也就没有存在的意义了。
04、重写方法的要求
规则三:重写的方法必须有相同的参数列表。
public class Animal {
void eat(String food) { }
}
Dog 类中的 eat() 方法保持了父类方法 eat() 的同一个调调,都有一个参数——String 类型的 food。
public class Dog extends Animal {
public void eat(String food) { }
}
一旦子类没有按照这个规则来,比如说增加了一个参数:
public class Dog extends Animal {
public void eat(String food, int amount) { }
}
这就不再是重写的范畴了,当然也不是重载的范畴,因为重载考虑的是同一个类。
规则四:重写的方法必须返回相同的类型。
父类没有返回类型:
public class Animal {
void eat(String food) { }
}
子类尝试返回 String:
public class Dog extends Animal {
public String eat(String food) {
return null;
}
}
于是就编译出错了(返回类型不兼容)。


