面向对象三大特征二

46 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情 这里先进入一个简单的引入:当一个类与另一个类有部分相同的方法时,据我们前面所讲解的,我们会选择用继承,子类继承父类的某些方法和属性,再结合使用方法重载修改或添加某些子类需要的功能或者在父类的基础上编写一些新的方法,这样不仅提高了代码的复用性,而且代码的维护也得到了一定的提高(当代码需要修改时,你不用每处都改,可能只用在父类或者子类上动一下)。这里我们将介绍当在一个类中使用很多方法重载,且其功能上是完全一致的,那么我们就可以考虑使用多态了,这里将会达到和继承类似的效果。

代码演示:

image.png

image.png 讲解: 在图片上方大家可以看到很多类,我们将其分为三大类来看,第一个是Food类,为Fish类和Bone类的直接父类;第二个为Animal类,为Cat类和Dog类的直接父类;第三个就是Master类,从代码可以简单看出,程序想表达的是,主任给某种动物为食某物,也就是通过我们的feed()方法。在第二张图片里仔细观察feed()方法,当主人每次喂养不同的动物时,我们都要用方法重载,修改它的参数列表,那么当我们这个动物(对象)很多时,我们就会有很多的这个feed()方法,有一天突然让你在这个方法里添加一点东西,比如说食物的分量,那你需要修改的地方将难以想象!

多态

概念:

方法或对象具有多种形态,且多态是建立在封装和继承之上的。(概念很简短,说实话我第一次看这个超级蒙圈,如果你说物体有多种形态,我倒是可以联想到物理上的气态、固态、液态等等,但谈到对象或方法有多态,真的很难不让人懵,肯定还是存在特别聪明的小伙伴哈)

具体体现:

方法的多态通过方法重载(同一个方法名,但是它会根据不同的参数列表被选择调用)和方法重写(将重写方法体);

对象的多态

  1. 一个对象的编译类型和运行类型可以不一致(简单来说就是在你new对象时,其实前面的对象名它的编译类型和运行类型可以不一样);
  2. 编译类型(创建对象时等号左边的)在定义对象时,就确立不能再改了;
  3. 运行类型(创建对象时等号右边的)是可以变化的。

父类的对象引用可以指向子类的对象 两种解释:首先对象名是对象的引用,不是堆里面的真实对象的空间,它只是指向该空间;其次,原来我们new对象时,对象引用就是当前的对象,这里举个例子,当父类为人,子类为学生时,给子类实例化一个对象“小明”,那么小明是学生的同时自然也是人,这样理解或许更加简单,但还是希望朋友们根据jvm来理解!