方法的重写 @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);
- 子类不能比父类抛出更多异常(以后再讨论。。。);
- 方法覆盖只是和方法有关,和属性无关;
- 静态方法能被继承,但不能被覆盖(重写)。