知识点:多态的概念、java中多态的使用(方法重载和重写、子类对象的多态性) 、多态使用的好处

1、什么是多态?

所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

2、深入理解

class Animal{
   public int month = 2;
   public void eat(){
       System.out.println("动物吃东西");
  } } class Dog extends Animal{
   public int month = 3;    public void eat() {
       System.out.println("小狗吃肉");
  }    public void sleep() {
       System.out.println("小狗睡午觉");
  }
} class Cat extends Animal{
   public int month = 4;    public void eat() {
       System.out.println("小猫吃鱼");
  }
} public class Test {
   public static void main(String[] args){
       Animal a = new Dog();
       Animal b = new Cat();
       a.eat();
       System.out.println(a.month);
       //下面代码编译时会出错
//       a.sleep();
       b.eat();
       System.out.println(b.month);   }
}

a对象编译时类型是Animal,运行时类型是Dog;

b对象编译时类型是Animal,运行时类型是Cat。

当运行时调用引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就表现出:相同类型的变量调用同一个方法时表现出不同的行为特征,这就是多态。

该例中:当他们调用eat方法时,实际调用的是父类Animal中被覆盖的eat方法。

运行结果:

小狗吃肉
2
小猫吃鱼
2

上例中main方法中注释了a.sleep(),由于a的编译时类型为Animal,而Animal类中没有sleep方法,因此无法在编译时调用sleep方法。

对象的实例变量不具备多态性

上例中a,b对象分别调用了month,可以看到,其输出结果都是2

总的来说:

引用变量在编译阶段只能调用编译时类型所具有的方法,但运行时则执行他运行时类型所具有的方法。

3、java中实现形式

在Java中有两种形式可以实现多态。继承和接口。

3.1.基于继承实现的多态

基于继承的实现机制主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。

3.2.基于接口实现的多态

继承是通过重写父类的同一方法的几个不同子类来体现的,那么就可就是通过实现接口并覆盖接口中同一方法的几不同的类体现的。

在接口的多态中,指向接口的引用必须是指定这实现了该接口的一个类的实例程序,在运行时,根据对象引用的实际类型来执行对应的方法。

继承都是单继承,只能为一组相关的类提供一致的服务接口。但是接口可以是多继承多实现,它能够利用一组相关或者不相关的接口进行组合与扩充,能够对外提供一致的服务接口。所以它相对于继承来说有更好的灵活性。

4、多态的好处

1.可替换性:多态对已存在的代码具有可替换性。

2.可扩充性:多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际 上新加子类更容易获得多态功能。  

3.接口性:多态是[超类]通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。

4.灵活性:它在应用中体现了灵活多样的操作,提高了使用效率。  

5.简化性:多态简化了对[应用软件]的代码编写和修改过程。

5、总结

指向子类的父类引用由于向上转型了,它只能访问父类中拥有的方法和属性,而对于子类中存在而父类中不存在的方法,该引用是不能使用的,尽管是重载该方法。若子类重写了父类中的某些方法,在调用该些方法的时候,必定是使用子类中定义的这些方法(动态连接、动态调用)。

对于面向对象而已,多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。

发哥讲

如果你觉得文章还不错,就请点击右上角选择发送给朋友或者转发到朋友圈~

● 扫码关注公众号

最新文章

  1. ucos 学习
  2. 集群(cluster)原理(转)
  3. hdu 1412 {A} + {B}
  4. 无法从“object”转换为“string”
  5. css怎么引用某张图片?链接要怎么写
  6. 使用和制作patch文件
  7. Web工程师的工具箱 | 酷壳 - CoolShell.cn
  8. grub 的安装与使用
  9. 推荐两款Windows管理工具
  10. 在sqlserver2005/2008中备份数据库,收缩日志文件
  11. 获取SpringMVC的映射路径
  12. 搭建ssr服务器
  13. Mahout系列之----共轭梯度预处理
  14. Leetcode_162_Find Peak Element
  15. [macOS] finder变慢提速
  16. C# 将当前应用程序写入到注册表开机启动项中
  17. What is SolrCloud? (And how does it compare to master-slave?)
  18. C++删除容器数据
  19. post请求参数Json字符串包含数组的校验和处理
  20. Vue.js—快速入门及实现用户信息的增删

热门文章

  1. 数据可视化基础专题(十三):Matplotlib 基础(五)常用图表(三)环形图、热力图、直方图
  2. js自定义方法绑定元素事件
  3. J.U.C体系进阶(一):juc-executors 执行器框架
  4. 集训作业 洛谷P1135 奇怪的电梯
  5. Android 性能优化 ---- 内存优化
  6. Vuex里的module选项和移动端布局
  7. Java中hashCode方法的理解以及此小结的总结练习(代码)
  8. DJANGO-天天生鲜项目从0到1-001-环境框架搭建
  9. Java应用服务器之tomcat session server msm搭建配置
  10. jmeter接口测试 -- 设置跨线程组的全局变量