面向对象三大特性:封装,继承和多态。其中,封装,继承都比较通俗易懂,唯有多态令我甚是头疼。经过仔细研究之后,终于搞懂了一点,特来做一个分享。独乐乐不如众乐乐。

何为多态?多态的本质是:一个程序中同名的不同方法。在面向对象的程序设计中,多态主要有以下三种方式来实现。

(1)、通过子类对父类方法的覆盖来实现多态。

(2)、通过一个类中方法的重载来实现多态。

(3)、通过将子类的对象作为父类的对象实现多态。


其中,前俩中方法比较容易理解,我们重点阐述第三种实现方法。

        把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。(这句话是我理解第三种方法的关键,请仔细阅读理解)

对象的引用型变量是具有多态性的,因为一个引用型变量可以指向不同形式的对象,即:子类对象作为父类对象来使用。

举一个例子,在一个单位中,有职工employee,职工中又有少数是管理者manager,管理者中又有一部分是领导。若小明是管理者manager类的对象,他也可以被看做是employee的对象,即他也可以被看做是一个职工,他同时具备着职工的所有属性。

代码如下:

public class testDuoTai {public static void main(String[] args) {Employee emp1=new Employee("小明",23, 1000);   //emp1是Employee的对象System.out.println(emp1.getInfo());Employee emp2=new Manager("小明",23, 1000,5000); //注意此处emp2是Manager类的对象System.out.println(emp2.getInfo());}}
//定义一个父类
class Employee
{String name;int age;float salary;Employee(){};Employee(String name,int age,float sal){this.name=name;this.age=age;this.salary=sal;              }String getInfo(){return "职工姓名:"+name+"年龄:"+age+"工资:"+salary;}
}
//定义一个子类
class Manager extends Employee
{float allowance;Manager(String name,int age,float sal,float aa){this.name=name;this.age=age;this.salary=sal;allowance=aa;}
}

输出结果如下:

职工姓名:小明年龄:23工资:1000.0
职工姓名:小明年龄:23工资:1000.0

此案例中,充分体现了多态性。即子类的对象可以作为父类的对象来使用。

再来看一道牛客网专项练习题:

下面代码的输出是什么?

public class Base
{private String baseName = "base";public Base(){callName();}public void callName(){System. out. println(baseName);}static class Sub extends Base{private String baseName = "sub";public void callName(){System. out. println (baseName) ;}}public static void main(String[] args){Base b = new Sub();}
}

A null                  B  sub              C  base

正确答案:A

解析:本题与内部类无关系,去掉内部类后代码如下:

public class Base {private String baseName = "base";public Base() {callName();}public void callName() {System.out.println(baseName);}public static void main(String[] args) {Base b = new Sub();}
}
class Sub extends Base {private String baseName = "sub";public void callName() {System.out.println(baseName);}
}

执行 Base b = new Sub();时由于多态 b编译时表现为Base类特性,运行时表现为Sub类特性,Base b = new Sub();不管是哪

种状态都会调用Base构造器执行 callName()方法;执行方法时,由于多台表现为子类特性,所以会先在子类是否有 callName();

而此时子类尚未初始化(执行完父类构造器后才会开始执行子类),如果有就执行,没有再去父类寻找。

Java多态学习笔记相关推荐

  1. java读书雷_Java多态学习笔记

    java多态学习笔记 概述 多态的格式与使用 /* 代码中体现多态性:父类引用指向子类对象. */ 格式: 父类名称 对象名 = new 子类名称(); 或者 接口名称 对象名 = new 实现类名称 ...

  2. java web学习笔记(持续更新)

    java web学习笔记 一.Java Web简介 二.认识Servlet 1.什么是Servlet? 2.请求路径 3.tomcat 4.Servlet的使用 三.Servlet简单应用 1.创建S ...

  3. 黑马程序员Java教程学习笔记(三)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(三) 面向对象:设计对象.注意事 ...

  4. Java入门学习笔记——郝斌(一)概述及面向对象

    Java入门学习笔记--郝斌 1.Java概述 java的起源和发展 java的特点 java的应用领域 java学习目标 环境变量的设置 为什么要设置path? path的设置 有关classpat ...

  5. Java NIO 学习笔记(三)----Selector

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  6. 可能是最全面的 Java G1学习笔记

    转载自 可能是最全面的 Java G1学习笔记 引子 最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题.总体来讲,对于G1我有几个疑惑 ...

  7. 深入浅出 Java CMS 学习笔记

    转载自  深入浅出 Java CMS 学习笔记 引子 带着问题去学习一个东西,才会有目标感,我先把一直以来自己对CMS的一些疑惑罗列了下,希望这篇学习笔记能解决掉这些疑惑,希望也能对你有所帮助. 1. ...

  8. Java NIO学习笔记之图解ByteBuffer

    转载自 Java NIO学习笔记之图解ByteBuffer ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰. <程序员的思维修炼>一本书讲过,主动学习,要 ...

  9. 转载:mongoDB java驱动学习笔记

    http://www.blogjava.net/watchzerg/archive/2012/09/22/388346.html mongoDB java驱动学习笔记 指定新mongo实例: Mong ...

最新文章

  1. 投票|PMCAFF产品经理第一课,下一站去哪?杭州、深圳、上海...
  2. java新闻分页_新闻实现分页显示
  3. Mysql设置某字段唯一
  4. .net core 在jenkins上自动构建 运行xunit ,生成测试报告
  5. 采用python的pyquery引擎做网页爬虫,进行数据分析
  6. win10中查看工作组计算机,win10查看工作组计算机,w10怎样查看工作组
  7. 名字作诗(藏头名字作诗)
  8. 微信支付 “商家转账到零钱”
  9. Matlab_插值与抽取
  10. 保护模式下的CPL,RPL,DPL与特权级检查(二)
  11. C#:List泛型集合
  12. 如何删除有外键关系的两张表的数据
  13. Android 开机动画
  14. 迅雷起死回生背后的男人,竟然是雷军
  15. 西涝东雪!数场冬季风暴轮番侵袭美国 多地预警
  16. 服务器怎么安装php文档,php在云服务器端的安装教程
  17. 转:杰克·韦尔奇: 好的CEO既有勇气放手,又懂得干涉
  18. 【190319】VC++ C/S结构视频聊天软件源码源代码
  19. 【算法练习】80.字符串轮转——奇淫技巧
  20. win8和win8.1升级win10预览版图文教程

热门文章

  1. 最全的数据中心(IDC)机房整体工程介绍
  2. Intellij Idea Database schemas显示
  3. math_泰勒多项式/Taylor级数常用麦克劳林级数
  4. Stata基础33讲(连享会公开课)
  5. 【蓝桥杯单片机】共阳数码管
  6. C++小白入职如何快速上手
  7. 第一章、linux入门及基本命令(案例讲解)
  8. 《向着光亮那方》刘同 读书笔记
  9. 《视频理解中的神经网络结构设计》讲座笔记 作者:邱钊凡
  10. MD5 SHA1 SHA256 SHA512 SHA1WithRSA RSA 的区别