从零开始学Java(十六)Java中方法覆盖的使用

上篇说到Java继承的定义使用 今天来了解下Java中的方法覆盖,通过这篇文章让大家理解在什么情况下我们需要进行方法覆盖,以及掌握在满足什么条件的时候构成方法覆盖

Java方法覆盖Override

学习方法覆盖之前,我们先来回顾一下方法重载(overload)什么情况下考虑使用方法重载呢?

在同一个类当中,如果功能相似,尽可能将方法名定义的相同,这样方便调用的同时代码也会美观。

那么,代码满足什么条件的时候能够构成方法重载呢?

只要在同一个类当中,方法名相同,参数列表不同(类型、个数、顺序),即构成方法重载。

再看看,方法重载和方法覆盖的区别在哪?

  • 方法重载发生在同一个类当中。

  • 方法覆盖是发生在具有继承关系的父子类之间。

  • 方法重载是一个类中,方法名相同,参数列表不同。

  • 方法覆盖是具有继承关系的父子类,并且重写之后的方法必须和之前的方法一致:方法名一致、参数列表一致、返回值类型一致。

带着同样的疑问往下看,开始去学习方法覆盖,什么是方法覆盖?什么情况下考虑方法覆盖?代码怎么写的时候就构成了方法覆盖呢?

接下来看一段代码:

public class People {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void speakHi(){System.out.println(this.name + "和别人打招呼!");}}
public class ChinaPeople extends People {//中国人}
public class AmericaPeople extends People {//美国人}
public class PeopleTest {public static void main(String[] args) {ChinaPeople cp = new ChinaPeople();cp.setName("张三");cp.speakHi();AmericaPeople ap = new AmericaPeople();ap.setName("jackson");ap.speakHi();}}

运行结果如下图所示:

“中国人”调用speakHi()方法希望输出的结果是“你好,我叫张三,很高兴见到你!”,“美国人”调用speakHi()方法更希望输出的结果是“Hi,My name is jackson,Nice to meet you!”,可见ChinaPeopleAmericaPeople从父类中继承过来的speakHi()方法已经不够子类使用了,那这个时候应该怎么办呢?

当然,此时就需要使用方法覆盖机制了。请看以下代码:

public class People {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void speakHi(){System.out.println(this.name + "和别人打招呼!");}}
public class ChinaPeople extends People {public void speakHi(){System.out.println("你好,我叫"+this.getName()+",很高兴认识你!");}}
public class AmericaPeople extends People {public void speakHi(){System.out.println("Hi,My name is "+this.getName()+",Nice to meet you!");}}
public class PeopleTest {public static void main(String[] args) {ChinaPeople cp = new ChinaPeople();cp.setName("张三");cp.speakHi();AmericaPeople ap = new AmericaPeople();ap.setName("jackson");ap.speakHi();}}

运行结果如下图所示:

以上程序中ChinaPeople和AmericaPeople将从People类中继承过来的speakHi()方法进行了覆盖,我们也看到了当speakHi()方法发生覆盖之后,子类对象会调用覆盖之后的方法,不会再去调用之前从父类中继承过来的方法。

那么,到底在什么情况下我们会考虑使用方法覆盖呢?

通过以上内容的学习,我们了解到只有当从父类中继承过来的方法无法满足当前子类业务需求的时候,需要将父类中继承过来的方法进行覆盖。

换句话说,父类中继承过来的方法已经不够用了,子类有必要将这个方法重新再写一遍,所以方法覆盖又被称为方法重写。当该方法被重写之后,子类对象一定会调用重写之后的方法。

那么,当程序具备哪些条件的时候,就能构成方法覆盖呢?

● 方法覆盖发生在具有继承关系的父子类之间,这是首要条件;

● 覆盖之后的方法与原方法具有相同的返回值类型、相同的方法名、相同的形式参数列表;

另外,在使用方法覆盖的时候,需要有哪些注意事项呢?

● 由于覆盖之后的方法与原方法一模一样,建议在开发的时候采用复制粘贴的方式,不建议手写,因为手写的时候非常容易出错,比如在Object类当中有toString()方法,该方法中的S是大写的,在手写的时候很容易写成小写tostring(),这个时候你会认为toString()方法已经被覆盖了,但由于方法名不一致,导致最终没有覆盖,这样就尴尬了;

● 私有的方法不能被继承,所以不能被覆盖;

● 构造方法不能被继承,所以也不能被覆盖;

● 覆盖之后的方法不能比原方法拥有更低的访问权限,可以更高(学习了访问控制权限修饰符之后你就明白了);

● 覆盖之后的方法不能比原方法抛出更多的异常,可以相同或更少(学习了异常之后就明白了);

● 方法覆盖只是和方法有关,和属性无关;

● 静态方法不存在覆盖(不是静态方法不能覆盖,是静态方法覆盖意义不大,学习了多态机制之后就明白了);

以上的注意事项还需要记忆,多下点功夫吧。

接下来我们再来看一段代码,对方法覆盖加深一下印象,业务需求是这样的:定义一个动物类,所有动物都有移动的行为,其中猫类型的对象在移动的时候输出“猫在走猫步!”,鸟儿类型的对象在移动的时候输出“鸟儿在飞翔!”,但是猫类型的对象具有一个特殊的行为,抓老鼠,这个行为不是所有动物对象都有的,是猫类型对象特有的:

public class Animal {public void move(){System.out.println("动物在移动!");}}
public class Cat extends Animal{public void move(){System.out.println("猫在走猫步!");}public void catchMouse(){System.out.println("猫抓老鼠!");}}
public class Bird extends Animal{public void move(){System.out.println("鸟儿在飞翔!");}}
public class Test {public static void main(String[] args) {Cat cat = new Cat();cat.move();cat.catchMouse();Bird bird = new Bird();bird.move();}}

运行结果如下图所示:

对方法覆盖总结一下,当父类中继承过来的方法无法满足当前子类业务需求的时候,子类有必要将父类中继承过来的方法进行覆盖/重写。方法覆盖发生在具有继承关系的父子类之间,方法覆盖的时候要求相同的返回值类型、相同的方法名、相同的形式参数列表。方法覆盖之后子类对象在调用的时候一定会执行覆盖之后的方法。

(0)

相关推荐

  • 设计模式 |备忘录模式(memento)

    定义: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态. 结构:(书中图,侵删) Originator:需要备份的类(写在便签上 ...

  • 结构型模式:组合模式

    文章首发: 结构型模式:组合模式 七大结构型模式之三:组合模式. 简介 姓名 :组合模式 英文名 :Composite Pattern 价值观 :专门解决各种树形疑难杂症 个人介绍 : Compose ...

  • 吊打面试官系列:说说hashCode和equals方法

    首先我们需要知道hashCode方法和equals方法都是属于Object类的方法.既然属于Object中public修饰的方法,那言外之就是所有对象默认都有这两个方法,只是有时候有的对象已对这两个方 ...

  • [从零开始学装系统六]windows10激活知识,正版盗版?数字许可?

    [从零开始学装系统六]windows10激活知识,正版盗版?数字许可?

  • 从零开始学投资(六)——如何评估基金经理的投资体系

    业绩归因 现在大家买基金,或多或少都会开始有看长期业绩的习惯了,当然这个也是最基本和最简单的思路. 但是,如果真的要对一个基金进行更加深入的判断,我们则需要对这个基金经理的业绩进行更深层的归因,这种归 ...

  • 大辽河上之十六—梦中的南河沿

    大辽河,是辽宁省独流入海河流浑河与其支流太子河合流后形成的下游河段的别称,系指浑河干流在盘锦市三岔河与太子河汇合后,由三岔河起始,向西南方向流至营口市永远角的大辽河口注入渤海辽东湾的下游94公里河段. ...

  • 从零开始学八字(六):干支知识下篇

    接上篇,本篇应写干支关系之内容,但干支关系复杂多变内容太多,三五篇之内根本完成不了,所以索性把这些更加具体的知识向后排.今天把干支基础知识中的另一重要内容,即干支易象,给大家罗列一下.既然是基础知识, ...

  • 看清自己(三十六、中芫村、桃坑乡)

    看清自己(三十六.中芫村.桃坑乡) <中芫村客家土屋群> 我们<晨报周刊>记者一行抵达中芫村时十点多,村书记兼村长罗件松在村部前坪等.我一下车看到几个人站坪里,我们车一到,他们 ...

  • 孙悟空有机会学三十六变,为何学了七十二变?他的缺陷很明显

    孙悟空有机会学三十六变,为何学了七十二变?他的缺陷很明显

  • 【关学文研】走近关学(十六)

    ​ 1 从上面随手举出的几个例子就可以看出,陕西文化界并没少"展示广义的地域文化的特色".不过,<关学文库>的出版的确是一件盛事,它起码说明,与其他地方相比,陕西更关注 ...

  • (491)语文课文十六个背诵方法

    抄诵法 俗话说:"抄一遍胜过读十遍." 读诗词或短文时先看一句抄一句:再看几句抄几句:最后看一段抄一段,直到看一篇抄一篇,也就是先读再抄,抄完再读. 时空法 记住要背内容中表示时间 ...

  • 柴胡疏肝散,疏的是谁?|六经三十六方|中...

    柴胡疏肝散,疏的是谁?|六经三十六方|中医学习圈 提到柴胡疏肝散,大家都想到了它的功效,即疏肝理气...