你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家。这是《教妹学 Java》专栏的第三十六篇,今天我们来谈谈 Java 中的多态——多态有什么好处?

本专栏中的代码已收录到 GitHub github.com/itwanger ,里面还有我精心为你准备的一线大厂面试题。

三妹开学了,学的计算机软件编程。她学校离我家很近,坐公交车也就 10 站路的距离, 每逢周末她都会来找我,让我辅导她学习 Java。作为一名拥有十余年编程经验的程序员,再加上父母给我们的这份血缘关系,我觉得义不容辞。

“二哥,今天我们要学习的内容是‘多态’,对吧?”看来三妹已经提前预习了我上次留给她的作业。

“是的,三妹。多态是 Java 中非常重要的一个概念。 ”我面带着朴实无华的微笑回答着她,“多态来源于两个希腊用语:poly(多)和 morphs(形态),所以多态(polymorphism)的意思是多种形态。”

“Java 中的多态有两种形式:编译时多态和运行时多态,可以通过方法重载和方法重写来实现。重载静态方法是编译时多态,今天我们主要来谈谈运行时多态。”

----正儿八经的分割线,正文开始------------

运行时多态或者动态方法调用是指,在运行时而不是编译时对重写方法的调用过程。在这个过程中,通过父类的一个引用变量来调用重写方法,具体调用的方法是通过引用指向的变量决定的。

如果一个父类的引用变量指向的是子类的对象,这被称之为“向上转型”。

代码示例如下所示:

class A{}
class B extends A{}public class UpcastingDemo {// 向上转型A a = new B();
}

对于向上转型,我们既可以使用父类作为引用变量的类型,也可以使用接口作为引用变量的类型。

interface I {}
class A{}
class B extends A implements I {}
public class UpcastingByIntefaceDemo {I i = new B();
}

关系是这样的:

B is-a A
B is-a I
B is-a Object

因为 Object 类是 Java 中所有类的超类。

来看下面这个例子:

/*** @author 微信搜「沉默王二」,回复关键字 PDF*/
class Father{void say() {System.out.println("老子说");}
}
public class Child extends Father {@Overridevoid say() {System.out.println("孩子说");}public static void main(String[] args) {Father f = new Child();f.say();}
}

在这个例子中,有两个类,父类 Father 和子类 Child,子类重写了父类的 say() 方法,我们可以通过父类的引用变量 f 来调用 say() 方法,但它指向的是子类对象,所以 Java 虚拟机在运行的时候会去调用子类的 say() 方法。来看一下程序的输出结果:

孩子说

方法可以重写(覆盖),但字段(成员变量)却不可以。来看下面这个例子:

/*** @author 微信搜「沉默王二」,回复关键字 PDF*/
class Car{int speedLimit = 60;
}class Honda extends Car {int speedLimit = 90;
}
public class CanntOverrideMemberDataDemo {public static void main(String[] args) {Car car = new Honda();System.out.println(car.speedLimit);}
}

程序输出结果如下所示:

60

在上面的例子中,子类 Honda 和父类 Car 有一个相同名字的字段 speedLimit,我们可以通过父类的引用变量 car 去访问 speedLimit,虽然 car 指向的是子类对象,但由于字段是不能被覆盖的,所以 car.speedLimit 访问的仍然是父类的字段。

“三妹,Java 多态我们就学到这里吧,它的用法我相信你一定全部掌握了。”我揉一揉犯困的双眼,疲惫地给三妹说。

“好的,二哥,我这就去练习去。”三妹似乎意犹未尽,这种学习状态真令我感到开心。

二哥肝了两天两夜,《程序员不可或缺的软实力》第一版强势来袭,纯手敲,足足 20 万字精华文章,贯穿了我十余年的编程生涯,涉及到了生活和工作中的方方面面,如果你是迷茫的在校大学生,或者刚入职的新人,相信我的个人经历,可以给你带去一些思考,从而树立起正确的人生观和价值观。

那这份 PDF 该怎么获取呢?

链接:https://pan.baidu.com/s/1p-akwfNQPs0bzKHAK_xZ8w 密码:9ps5

大爷的,我自己原创的 PDF 都被投诉,黑子真可怕。如链接失效,请转至备用链接:https://shimo.im/docs/pJQv6qVcHqdYwrxx

最后,真心希望这份 PDF 能够对大家起到实质性的帮助,我也会在后面不断完善这本电子书,敬请期待。

教妹学Java(三十六):Java 多态的好处相关推荐

  1. Java从零开始学三十六(JAVA IO- 字符流)

    一.字符流 BufferedReader:BufferedReader是从缓冲区之中读取内容,所有的输入的字节数据都将放在缓冲区之中 BufferedWriter:把一批数据写入到缓冲区,当缓冲区区的 ...

  2. 教妹学Java(二十六):static 关键字解析

    你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家.这是<教妹学 Java>专栏的第二十六篇,今天我们来谈谈 Java 的 static 关键字--什么是静态变量?什么是静态方 ...

  3. 教妹学Java(三十二):了解 Java 中的返回类型协变

    你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家.这是<教妹学 Java>专栏的第二十七篇,今天我们来谈谈 Java 中的返回类型协变--Java 的返回值类型支持协变.换句 ...

  4. 教妹学Java(十九):continue 关键字详解

    你好呀,我是沉默王二,是<Web 全栈开发进阶之路>的作者,CSDN 2019 年度的博客之星.<教妹学 Java>是一套非常有趣的付费专栏,除了继续保持幽默风趣的行风风格,我 ...

  5. 教妹学Java(二十二):来吧,一文彻底搞懂Java命名约定

    你好呀,我是沉默王二,是<Web 全栈开发进阶之路>的作者,CSDN 博客之星.<教妹学 Java>是一套非常有趣的付费专栏,除了继续保持幽默风趣的行风风格,我还力求把每一个知 ...

  6. 教妹学Java(二十):一文带你彻底了解 Java 中的注释,干货了

    你好呀,我是沉默王二,一枚颜值与才华俱在的程序员.本篇教程通过我和三妹对话的形式来谈一谈"Java 中的注释". 教妹学 Java,没见过这么有趣的标题吧?"语不惊人死不 ...

  7. 教妹学Java(十四):switch 语句详解

    大家好,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员.本篇文章通过我和三妹对话的形式来谈一谈"switch 语句". 教妹学 Java,没见过这么有趣的标题吧?&q ...

  8. 教妹学Java(六):JDK,JRE和JVM之间有什么区别?

    大家好,我是沉默王二.本篇文章通过我和三妹的对话来谈一谈"JDK,JRE 和 JVM 之间的区别".本文付费,为表谢意,附送上个人微信(qing_gee),坑位所剩无几,快加,你有 ...

  9. 教妹学Java(三十三):super 关键字的用法

    你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家.这是<教妹学 Java>专栏的第二十七篇,今天我们来谈谈 Java 的 super 关键字--super 关键字有哪些用法? ...

最新文章

  1. ASP.NET中利用cookies保持客户端信息
  2. 5分钟让你懂得什么是容器技术?
  3. Spark编程基础(Python版)
  4. 【转】时间序列分析——基于R,王燕
  5. TypeScript里的中括号类型定义法
  6. 用Java编写Hadoop MapReduce任务
  7. UDP模式与TCP模式的区别
  8. jpg图片使用pil的resize后_刚毕业,求解“pdf转换为jpg”的操作教程
  9. myftpadmin+proftpd+mysql架设ftp服务器_[教程]在CentOS7上配置 FTP服务器 Proftpd 支持 MySQL 虚拟用户加密认证以及磁盘限额(Quota)...
  10. Spark内核解析之五:Spark Shuffle解析
  11. Lightroom Classic 教程,如何在 Lightroom 中使用调整画笔?
  12. 联想 缺少计算机所需的介质驱动程序,联想笔记本缺少驱动应该怎么办
  13. android 哈哈镜,Carnival Mirror App(哈哈镜模拟器)
  14. 尚雯婕-《6合辑》专辑[APE/FLAC整轨]
  15. blast2go下载和本地安装
  16. python简易双人五子棋
  17. 波司登 × 阿里云 × 奇点云:教科书式的数智化转型实践
  18. 没牙仔的世界(C++)
  19. java vcard格式_使用Cardme Java创建VCard
  20. 不经历风雨,怎么见彩虹,没有人能随随便便成功

热门文章

  1. windows 2012 重置开机密码
  2. Python图片处理库Wand的简单使用
  3. 傲慢与偏见,select()最基本性能测试数据——The C10M Problem
  4. C++中typedef和类型别名
  5. 5G初级中级选择和判断
  6. flink-1.11 Application 模式
  7. JAVA毕设项目五金机电市场批发零售管理信息系统(java+VUE+Mybatis+Maven+Mysql)
  8. VMware中chrome、Edge浏览器透明菜单、白菜单 及 复制虚拟机互相踢、冲突问题解决
  9. gre备考准备什么资料比较好?
  10. 干洗店软件,洗衣洗鞋线上下单小程序开发