方法的重写 @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);
  • 子类不能比父类抛出更多异常(以后再讨论。。。);
  • 方法覆盖只是和方法有关,和属性无关
  • 静态方法能被继承,但不能被覆盖(重写)。
posted @ 2022-03-18 15:34  鹿先森JIAN  阅读(68)  评论(0编辑  收藏  举报