方法的重写 @Override
@Override “方法覆盖”又叫做”方法重写”,为了有效地与”方法重载”进行区分,以后我们就叫方法覆盖。
学习方法覆盖之前,我们先来回顾一下方法重载(overload),什么情况下考虑使用方法重载呢?
请看这里:方法重载Overload - 鹿先森JIAN - 博客园 (cnblogs.com)
那什么是方法覆盖?什么情况下考虑方法覆盖?代码怎么写的时候就构成了方法覆盖呢?
一句话,父类方法无法满足子类需求,子类需要建立在父类方法基础上改造成子类需要的方法。
接下来看一段代码:
public class ChinaPeople extends People { }
public class AmericaPeople extends People { }
执行结果:
张三和别人打招呼!
jackson和别人打招呼!
“中国人”调用speakHi()方法希望输出的结果是“你好,我叫张三,很高兴见到你!”,“美国人”调用speakHi()方法更希望输出的结果是“Hi,My name is jackson,Nice to meet you!”,可见 ChinaPeople 和 AmericaPeople 从父类中继承过来的 speakHi()方法已经不够子类使用了,那这个时候应该怎么办呢?当然,此时就需要使用方法覆盖机制了。
public class ChinaPeople extends People { @Override public void speakHi(){ Systemout.println("你好,我叫" + this.getName() + ",很高兴认识你!"); } }
public class AmericaPeople extends People { @Override public void speakHi(){ Systemout.println("Hi,My name is" + this.getName() + ",Nice to meet you!"); } }
执行结果:
你好,我叫张三,很高兴认识你!
Hi,My name is jackson,Nice to meet you!
以上程序中 ChinaPeople 和 AmericaPeople 将从People 类中继承过来的 speakHi()方法进行了覆盖,我们也看到了当 speakHi()方法发生覆盖之后,子类对象会调用覆盖之后的方法,不会再去调用之前从父类中继承过来的方法。
方法覆盖的条件:
- 方法覆盖发生在具有继承关系的父子类之间,这是首要条件;
- 覆盖之后的方法与原方法具有相同的返回值类型、相同的方法名、相同的形式参数列表。
方法覆盖的注意事项:
- 私有的方法不能被继承,所以不能被覆盖;
- 构造方法不能被继承,所以也不能被覆盖;
- 访问权限修饰符:子类 >= 父类(public > protected > friendly > private);
- 子类不能比父类抛出更多异常(以后再讨论。。。);
- 方法覆盖只是和方法有关,和属性无关;
- 静态方法能被继承,但不能被覆盖(重写)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)