多态:可以理解为事物存在的多种体现形态

如:人:男人,女人

  动物:猫,狗,鸟

猫这个动物应该是猫类型的:猫 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

多态的概念,特点与使用相关推荐

  1. C++中多态的概念和意义

    文章目录 1 C++中多态的概念和意义 1.1 函数重写回顾 1.2 多态的概念 1.3 多态的意义 1.4 静态联编和动态联编 2 特殊的虚函数 2.1 构造函数能成为虚函数吗 2.2 析构函数能成 ...

  2. Java:多态的概念和案例实现

    一.多态的概念 多态性是指同一个操作作用于某一类对象,可有不同的解释,产生不同的执行结果 多态存在的三个必要条件         需要存在继承或实现关系         同样的方法调用而执行不同的操作 ...

  3. 多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)

    多态的概念: 多态性是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果. 多态存在的三个必要条件: ① 需要存在继承或实现关系 ② 同样的方法调用而执行不同的操作.运行不同代码(重写 ...

  4. 【C++深度剖析教程27】多态的概念与意义

    今天来学习一个新的概念,多态!!!多态在C++编程中具有重要的地位与意义,是面向对象的一个重要思想! 加qq1126137994一起学习更多技术~ 1.问题引入 父类与子类之间具有赋值兼容性; *子类 ...

  5. Java 中多态的概念以及前提条件

    多态的概念  * 一个事物在不同时刻的体现(堆内存中对象形式)  * 多态的前提条件:  * 1)必须有继承关系(继承的好处第三点作为多态的前提条件)  *     如果没有继承谈不上多态  * 2) ...

  6. 多态的概念,多态的原理,多态解决什么问题

    目录 一.多态能解决什么问题 二.多态的概念 三,多态的原理 一.多态能解决什么问题 问题:通过基类指针只能访问派生类的成员变量,不能访问派生类的成员函数 (包括析构函数也不能访问)----(这也是为 ...

  7. Java多态的概念、优点和用法

    1. 多态的概念 Java中面向对象有三大特性:封装.继承和多态.         Java中的多态是什么,表现在哪里?         允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象 ...

  8. java多态的概念_java中多态是什么?概念详解

    对于java中的多态你是怎样理解的呢?很多人表示,自己对于多态的概念不是很清楚,那么下面就让我们一起来详细的了解一下吧. 1.什么是多态? 多态简单的来说就是一种事物的多种存在形态. 在面向对象语言当 ...

  9. java中的多态的概念_java中多态的概念

    多态的概念 多态==晚绑定. 不要把函数重载理解为多态. 因为多态是一种运行期的行为,不是编译期的行为. 多态:父类型的引用可以指向子类型的对象. 比如 Parent p = new Child(); ...

  10. python多态的概念_Python 多态

    Python 多态 一.多态 概念 允许将父对象设置成和一个或多个的他的子对象相等技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特征以不同的方式运作.简单来说:就是允许将子类型的指针赋值给父类 ...

最新文章

  1. pycharm 远程调试图文_Pycharm配置远程调试的图文步骤
  2. bilibili源码_selenium+phantomjs爬取bilibili
  3. metadata model entry in /IWFND/CL_MED_MDL_SVC_GRP
  4. 逃离迷茫和枯燥,让自己快乐起来
  5. 中国速度之二神山建设(3):有力的技术保障,基建世界里的云原生缩影 | IDCF DevOps案例研究...
  6. 动态添加Html单元格时,事件怎么写?如mouseover事件
  7. 开奖啦!CSDN 程序员节 1024 中奖名单揭晓!
  8. 《React小书》终结笔记
  9. 图像匹配论文总结(一)
  10. Win10 快捷操作
  11. mir显示服务器,The Legend Of Mir 服务器程序安装说明(图片)
  12. 【项目】Online Judge(在线评判系统)
  13. Oracle提取中文字符串拼音首字母函数
  14. 计算机视觉与深度学习(12)
  15. 德国金融监管机构就区块链证券监管发布公告
  16. 2012多校联盟第二场1009 还是BFS
  17. 1+x证书Web前端开发中级理论考试(试卷1)
  18. 华为与小米在印度市场翻倍增长,两者会重演国内市场之争么?
  19. 让“纯视觉派”特斯拉都反悔,4D毫米波雷达究竟有何魔力?
  20. 2019软件测试培训费用多少?

热门文章

  1. md 生成目录 码云_搭建简易博客方案
  2. 基于jsp+mysql+Spring的SpringBoot招聘网站项目(完整源码+sql)主要实现了管理员登录,简历管理,问答管理,职位管理,用户管理,职位申请进度更新,查看简历
  3. rust windows 交叉编译_树莓派上使用rust:交叉编译
  4. 接口-----java
  5. 让8只数码管初始显示零,每隔大约1s加一显示,到数码管显示9后,再从一开始显示
  6. matlab建立的发动机的模型,奇瑞使用基于模型的设计实现发动机管理系统软件的自主开发...
  7. hive mysql集群安装_HIVE完全分布式集群安装过程(元数据库: MySQL)
  8. android 自定义库,Android自定义Log库
  9. 没有bug队——加贝——Python 41,42
  10. 详细分析如何利用python批量爬取百度图片