方法的重写
目录
- 1、重写的概念
- 2、方法重写的规则
- 3、重写 VS 重载
1、重写的概念
重写,也称为覆盖,是子类对父类的非构造、非静态、非 final 修饰、非 private 修饰的方法的实现过程的重新编写。重写可以让子类根据需要来实现父类的方法。方法重写是子类与父类的一种多态性表现。
2、方法重写的规则
- 重写的方法,可以使用 @Override 注解来显示指定,这个注解可以帮我们合法校验重写是否成功,比如重写的方法名由 flush 错写成 f1ush,用肉眼看会很容易忽略这个错误,而加上这个注解可以帮我们校验出来。
- 子类重写父类的方法时,一般来说要和父类方法的原型相同,即修饰符 返回值类型 方法名 (参数列表)完全一致。
- 子类不能重写父类的 final 修饰的方法、private 修饰的方法、构造方法和静态方法。
// 父类
public class Base {
// 1、无参构造方法
public Base() {
}
// 2、private 修饰的方法
private void method1(){
System.out.println("Base.method1");
}
// 3、静态方法
public static void method2(){
System.out.println("Base.method2");
}
// 4、final 修饰的方法
public final void method3(){
System.out.println("Base.method3");
}
}
// 子类
public class Derived extends Base{
// 1、重写父类的构造方法报错
// 创建子类对象的时候会调用子类的构造方法,在子类构造方法中又会调用父类的构造方法
// 如果对父类构造方法进行重写,那么对象创建好后会再一次调用父类构造方法,这样做没有任何意义
// 况且构造方法是为了将对象的属性初始化完整,并不能实现多态
// 而且在语法上严格禁止子类重写父类的构造方法
@Override
public Base(){
}
// 2、重写父类 private 修饰的方法报错
// private 修饰的方法无法在类外,也不能在类外的子类中的方法被访问,更不可能实现多态
@Override
private void method1(){
System.out.println("Derived.method1");
}
// 3、重写父类的静态方法报错
// 在实现多态时,需要通过父类的引用来调用子类中被重写的方法,在程序编译期间无法知道调用的是哪个类的方法
// 只有在运行阶段,父类引用指向具体的对象时才知道,从而调用对应子类的对象中的方法实现多态
// 根据实现多态的条件可知:被重写的方法要通过对象来调用,而静态方法没有 this 引用,因此无法被对象调用,所以静态方法不能被重写
@Override
public static void method2(){
System.out.println("Derived.method2");
}
// 4、重写父类 final 修饰的方法报错
// 被 final 修饰的方法不能进行重写
@Override
public final void method3(){
System.out.println("Derived.method3");
}
}
- 被重写的方法返回值类型可以不同,但必须是具有父子关系的。
// 方法返回值类型是父类类型,而 return 的是子类类型
public static Base method1(){
return new Derived();
}
- 子类中的访问权限可以和父类中的不同,但是必须比父类中的更低。访问权限排序:public > protected > default > private。
3、重写 VS 重载
方法重载是一个类的多态性的表现,而方法重写是子类与父类的一种多态性表现。