Java多态学习笔记
面向对象三大特性:封装,继承和多态。其中,封装,继承都比较通俗易懂,唯有多态令我甚是头疼。经过仔细研究之后,终于搞懂了一点,特来做一个分享。独乐乐不如众乐乐。
何为多态?多态的本质是:一个程序中同名的不同方法。在面向对象的程序设计中,多态主要有以下三种方式来实现。
(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多态学习笔记相关推荐
- java读书雷_Java多态学习笔记
java多态学习笔记 概述 多态的格式与使用 /* 代码中体现多态性:父类引用指向子类对象. */ 格式: 父类名称 对象名 = new 子类名称(); 或者 接口名称 对象名 = new 实现类名称 ...
- java web学习笔记(持续更新)
java web学习笔记 一.Java Web简介 二.认识Servlet 1.什么是Servlet? 2.请求路径 3.tomcat 4.Servlet的使用 三.Servlet简单应用 1.创建S ...
- 黑马程序员Java教程学习笔记(三)
学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(三) 面向对象:设计对象.注意事 ...
- Java入门学习笔记——郝斌(一)概述及面向对象
Java入门学习笔记--郝斌 1.Java概述 java的起源和发展 java的特点 java的应用领域 java学习目标 环境变量的设置 为什么要设置path? path的设置 有关classpat ...
- Java NIO 学习笔记(三)----Selector
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- 可能是最全面的 Java G1学习笔记
转载自 可能是最全面的 Java G1学习笔记 引子 最近遇到很多朋友过来咨询G1调优的问题,我自己去年有专门学过一次G1,但是当时只是看了个皮毛,因此自己也有不少问题.总体来讲,对于G1我有几个疑惑 ...
- 深入浅出 Java CMS 学习笔记
转载自 深入浅出 Java CMS 学习笔记 引子 带着问题去学习一个东西,才会有目标感,我先把一直以来自己对CMS的一些疑惑罗列了下,希望这篇学习笔记能解决掉这些疑惑,希望也能对你有所帮助. 1. ...
- Java NIO学习笔记之图解ByteBuffer
转载自 Java NIO学习笔记之图解ByteBuffer ByteBuffer前前后后看过好几次了,实际使用也用了一些,总觉得条理不够清晰. <程序员的思维修炼>一本书讲过,主动学习,要 ...
- 转载:mongoDB java驱动学习笔记
http://www.blogjava.net/watchzerg/archive/2012/09/22/388346.html mongoDB java驱动学习笔记 指定新mongo实例: Mong ...
最新文章
- 投票|PMCAFF产品经理第一课,下一站去哪?杭州、深圳、上海...
- java新闻分页_新闻实现分页显示
- Mysql设置某字段唯一
- .net core 在jenkins上自动构建 运行xunit ,生成测试报告
- 采用python的pyquery引擎做网页爬虫,进行数据分析
- win10中查看工作组计算机,win10查看工作组计算机,w10怎样查看工作组
- 名字作诗(藏头名字作诗)
- 微信支付 “商家转账到零钱”
- Matlab_插值与抽取
- 保护模式下的CPL,RPL,DPL与特权级检查(二)
- C#:List泛型集合
- 如何删除有外键关系的两张表的数据
- Android 开机动画
- 迅雷起死回生背后的男人,竟然是雷军
- 西涝东雪!数场冬季风暴轮番侵袭美国 多地预警
- 服务器怎么安装php文档,php在云服务器端的安装教程
- 转:杰克·韦尔奇: 好的CEO既有勇气放手,又懂得干涉
- 【190319】VC++ C/S结构视频聊天软件源码源代码
- 【算法练习】80.字符串轮转——奇淫技巧
- win8和win8.1升级win10预览版图文教程