子类继承了父类的方法,但如果父类的方法不满足子类的需求怎么办?比如第一代手机只能打电话,第三代智能手机需要视频通话。
这时候就需要“方法重写”——子类把父类的方法重新写一遍,让它更符合自己的需求。
今天这篇文章,把方法重写的概念、规则、注意事项一次讲清楚。
一、书写规则:抽取共性
和成员变量一样,继承中成员方法的书写规则也是把多个子类共有的方法抽取到父类中。子类不需要重复编写,直接继承使用即可。
二、调用规则:就近原则
调用方法时,Java会遵循就近原则:
直接写方法名(等价于
this.方法名()):先找子类,子类有就用子类的;子类没有,才去父类找。super.方法名():直接去父类找,跳过子类。
class Fu { public void method() { System.out.println("父类方法"); } } class Zi extends Fu { public void method() { System.out.println("子类方法"); } public void show() { method(); // 子类方法(就近原则) this.method(); // 子类方法(从本类开始找) super.method(); // 父类方法(跳过子类) } }三、方法重写是什么?
方法重写:在继承体系中,子类中出现了一个和父类方法声明完全一致的方法,就叫方法重写。
方法声明包括:修饰符、返回值类型、方法名、参数列表。这四个必须和父类一模一样。
建议在重写的方法上加上@Override注解。它的作用是让编译器帮你检查:如果重写语法不对,直接报错。
四、什么时候需要重写?
当父类的方法不能满足子类的需求时,就需要重写。
比如手机的例子:
第一代手机(父类):只有打电话(普通语音)
第三代智能手机(子类):需要打电话(视频通话)
父类的call()方法只能语音通话,不能满足子类的需求,子类就需要重写这个方法,把语音通话升级成视频通话。
五、重写的核心规则
1. 方法名和参数列表必须完全一致
不一致直接编译报错。这是最基础的规则。
2. 访问权限:子类必须大于等于父类
权限修饰符范围:private < 缺省(不写) < protected < public
比如父类方法是protected,子类可以是protected或public,但不能是缺省或private。
3. 返回值类型:子类必须小于等于父类
这个规则在日常开发中很少用到,了解即可。实际开发中建议保持和父类完全一致。
4. 哪些方法不能被重写?
private私有方法(子类根本看不到)static静态方法(属于类,不属于对象)final最终方法(被final修饰的方法不能重写)
另外,被final修饰的类是最终类,不能被继承,里面的所有方法自然也不能被重写。
六、开发建议
实际开发中,重写方法时建议把方法声明和父类保持完全一致,不要去改权限和返回值类型。这样最安全,也最不容易出错。
方法体按照子类的实际需求编写即可。如果重写的方法里还需要用到父类的原方法,可以用super.方法名()调用。
七、完整示例
// 父类:第一代手机 class Phone { public void call() { System.out.println("语音通话"); } } // 子类:智能手机 class SmartPhone extends Phone { @Override public void call() { // 重写:先保留父类的功能,再扩展 super.call(); // 先语音通话 System.out.println("视频通话"); // 再视频通话 } }八、知识点总结
| 场景 | 规则 |
|---|---|
| 书写规则 | 抽取子类共性方法到父类 |
| 调用规则 | 就近原则:子类优先,子类没有才找父类 |
this调用 | 先找子类,再找父类 |
super调用 | 直接找父类,跳过子类 |
| 重写定义 | 子类中出现和父类方法声明完全一致的方法 |
| 使用场景 | 父类方法不能满足子类需求时 |
| 核心要求 | 方法名、参数列表必须一致 |
| 不能重写 | private、static、final方法 |