多态的概念,特点与使用
多态:可以理解为事物存在的多种体现形态
如:人:男人,女人
动物:猫,狗,鸟
猫这个动物应该是猫类型的:猫 cat = new 猫();
同时猫也是动物的一种:动物 y = new 猫(); 动物是猫和狗具体事物抽取出来的父类型,父类型指向了子类对象
1、多态的体现
父类的引用指向了自己的子类对象
父类的引用也可以接收自己的子类对象
2、多态的前提
必须是类与类之间有关系,要么继承,要么实现
还有一个前提:存在覆盖
3、多态的好处
多态的出现大大的提高了程序的扩展性
4、多态的弊端
虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员
5、多态的应用
6、多态使用的注意事项
看一个关于多态的例子:
1 abstract class Teacher 2 { 3 public abstract void teach(); 4 public void sleep() 5 { 6 System.out.println("睡觉"); 7 } 8 } 9 class MathTeacher extends Teacher 10 { 11 public void teach() 12 { 13 System.out.println("教数学"); 14 } 15 } 16 class ChineseTeacher extends Teacher 17 { 18 public void teach() 19 { 20 System.out.println("教语文"); 21 } 22 public void sleep() 23 { 24 System.out.println("睡觉在沙发上"); 25 } 26 } 27 //将代码进一步优化,定义一个工具类,这样就不需要实例化每一个老师对象,直接调用工具类,然后把各种类型的Teacher传进去既可 28 class TeachTest 29 { 30 public static void teach(Teacher t)//Teacher t类型是Teacher由于多态可以直接传MathTeacher等 31 { 32 t.teach(); 33 t.sleep(); 34 } 35 } 36 class Test 37 { 38 public static void main(String[] args) 39 { 40 /* 41 实例化一个新的数学老师 42 Teacher t = new MathTeacher(); 类型提升,向上转型 43 t.sleep(); 44 如果想要调用猫的特有方法该怎么做? 45 强制将父类引用转成子类类型,向下转型 46 MathTeacher mt = (MathTeacher)t; 47 mt.teach(); 就可以调用数学老师里面的教学方法 48 */ 49 /* 50 如果要调用类的方法,先实例化一个类,然后分别调用 51 MathTeacher mt = new MathTeacher(); 52 mt.teach(); 53 mt.sleep(); 54 ChineseTeacher ct = new ChineseTeacher(); 55 ct.teach(); 56 ct.sleep(); 57 发现这样比较麻烦,向上抽取,定义一个新的工具类TeachTest,将方法封装进去 58 */ 59 TeachTest tt = new TeachTest(); 60 tt.teach(new MathTeacher()); 61 tt.teach(new ChineseTeacher()); 62 } 63 }
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败
在运行时期:参阅对象所属的类中是否有调用的方法
简单总结:成员函数在多态调用时,编译看左边,运行看右边
(面试)在多态中成员变量,静态成员函数的特点:
无论编译或运行,都参考左边(引用型变量所属的类)
如:
1 Fu f = new Zi(); 2 System.out.println(f.num);//打印的是父类里面的变量num 3 Zi z = new Zi(); 4 System.out.println(z.num);//打印的是子类里面的变量num 5 //静态的方法也是一样。
一个集合了接口,多态的例子
1 /* 2 类 主板,主板有运行方法run() 3 一段时间后想要上网 加入网卡类 4 想要听音乐 加入 声卡类 5 6 但是这样一个一个的加入使得代码的扩展性很差,每次都要重新修改很多代码 7 8 于是引入一个通用的接口PCI类 9 所有设备都有打开和关闭功能 10 让网卡和声卡分别取实现PCI接口,重写成自己的打开和关闭功能 11 12 给主板加上一个实现pcirun的方法,传递参数的值为PCI类型的 13 可以利用多态PCI p = new NetCard(); 14 15 所以在下面主函数中运行时 创建新的主板对象以后 16 mb.pcirun(new NetCard()); 17 mb.pcirun(new SoundCard()); 18 就可以分别使用网卡和声卡了,如果以后还要再加入比如显卡 19 就只需要建立一个显卡类去实现PCI接口,然后直接用主板中的pcirun方法就可以了。 20 21 */ 22 class MainBoard 23 { 24 public void run() 25 { 26 System.out.println("mainboard run"); 27 } 28 public void pcirun(PCI p) 29 { 30 p.open(); 31 p.close(); 32 } 33 } 34 interface PCI 35 { 36 public abstract void open(); 37 public abstract void close(); 38 } 39 class NetCard implements PCI 40 { 41 public void open() 42 { 43 System.out.println("netcard open"); 44 } 45 public void close() 46 { 47 System.out.println("netcard close"); 48 } 49 } 50 class SoundCard implements PCI 51 { 52 public void open() 53 { 54 System.out.println("SoundCard open"); 55 } 56 public void close() 57 { 58 System.out.println("SoundCard close"); 59 } 60 } 61 class Test 62 { 63 public static void main(String[] args) 64 { 65 MainBoard mb = new MainBoard(); 66 mb.run(); 67 mb.pcirun(new NetCard()); 68 mb.pcirun(new SoundCard()); 69 } 70 } 71 /* 72 这样做的好处: 73 大大的降低了主板和各种独立设备直接的耦合性 74 中间用一个PCI接口来连接起来 75 程序日后非常方便扩展 76 */
转载于:https://www.cnblogs.com/vilyo/archive/2012/08/05/2623554.html
多态的概念,特点与使用相关推荐
- C++中多态的概念和意义
文章目录 1 C++中多态的概念和意义 1.1 函数重写回顾 1.2 多态的概念 1.3 多态的意义 1.4 静态联编和动态联编 2 特殊的虚函数 2.1 构造函数能成为虚函数吗 2.2 析构函数能成 ...
- Java:多态的概念和案例实现
一.多态的概念 多态性是指同一个操作作用于某一类对象,可有不同的解释,产生不同的执行结果 多态存在的三个必要条件 需要存在继承或实现关系 同样的方法调用而执行不同的操作 ...
- 多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)
多态的概念: 多态性是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果. 多态存在的三个必要条件: ① 需要存在继承或实现关系 ② 同样的方法调用而执行不同的操作.运行不同代码(重写 ...
- 【C++深度剖析教程27】多态的概念与意义
今天来学习一个新的概念,多态!!!多态在C++编程中具有重要的地位与意义,是面向对象的一个重要思想! 加qq1126137994一起学习更多技术~ 1.问题引入 父类与子类之间具有赋值兼容性; *子类 ...
- Java 中多态的概念以及前提条件
多态的概念 * 一个事物在不同时刻的体现(堆内存中对象形式) * 多态的前提条件: * 1)必须有继承关系(继承的好处第三点作为多态的前提条件) * 如果没有继承谈不上多态 * 2) ...
- 多态的概念,多态的原理,多态解决什么问题
目录 一.多态能解决什么问题 二.多态的概念 三,多态的原理 一.多态能解决什么问题 问题:通过基类指针只能访问派生类的成员变量,不能访问派生类的成员函数 (包括析构函数也不能访问)----(这也是为 ...
- Java多态的概念、优点和用法
1. 多态的概念 Java中面向对象有三大特性:封装.继承和多态. Java中的多态是什么,表现在哪里? 允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象 ...
- java多态的概念_java中多态是什么?概念详解
对于java中的多态你是怎样理解的呢?很多人表示,自己对于多态的概念不是很清楚,那么下面就让我们一起来详细的了解一下吧. 1.什么是多态? 多态简单的来说就是一种事物的多种存在形态. 在面向对象语言当 ...
- java中的多态的概念_java中多态的概念
多态的概念 多态==晚绑定. 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = new Child(); ...
- python多态的概念_Python 多态
Python 多态 一.多态 概念 允许将父对象设置成和一个或多个的他的子对象相等技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特征以不同的方式运作.简单来说:就是允许将子类型的指针赋值给父类 ...
最新文章
- pycharm 远程调试图文_Pycharm配置远程调试的图文步骤
- bilibili源码_selenium+phantomjs爬取bilibili
- metadata model entry in /IWFND/CL_MED_MDL_SVC_GRP
- 逃离迷茫和枯燥,让自己快乐起来
- 中国速度之二神山建设(3):有力的技术保障,基建世界里的云原生缩影 | IDCF DevOps案例研究...
- 动态添加Html单元格时,事件怎么写?如mouseover事件
- 开奖啦!CSDN 程序员节 1024 中奖名单揭晓!
- 《React小书》终结笔记
- 图像匹配论文总结(一)
- Win10 快捷操作
- mir显示服务器,The Legend Of Mir 服务器程序安装说明(图片)
- 【项目】Online Judge(在线评判系统)
- Oracle提取中文字符串拼音首字母函数
- 计算机视觉与深度学习(12)
- 德国金融监管机构就区块链证券监管发布公告
- 2012多校联盟第二场1009 还是BFS
- 1+x证书Web前端开发中级理论考试(试卷1)
- 华为与小米在印度市场翻倍增长,两者会重演国内市场之争么?
- 让“纯视觉派”特斯拉都反悔,4D毫米波雷达究竟有何魔力?
- 2019软件测试培训费用多少?
热门文章
- md 生成目录 码云_搭建简易博客方案
- 基于jsp+mysql+Spring的SpringBoot招聘网站项目(完整源码+sql)主要实现了管理员登录,简历管理,问答管理,职位管理,用户管理,职位申请进度更新,查看简历
- rust windows 交叉编译_树莓派上使用rust:交叉编译
- 接口-----java
- 让8只数码管初始显示零,每隔大约1s加一显示,到数码管显示9后,再从一开始显示
- matlab建立的发动机的模型,奇瑞使用基于模型的设计实现发动机管理系统软件的自主开发...
- hive mysql集群安装_HIVE完全分布式集群安装过程(元数据库: MySQL)
- android 自定义库,Android自定义Log库
- 没有bug队——加贝——Python 41,42
- 详细分析如何利用python批量爬取百度图片