多态的概念,特点与使用

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

如:人:男人,女人

  动物:猫,狗,鸟

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

链表队列入门介绍

1,快速开始: 队列是一种和栈相反的,遵循先进先出原则的线性表。此文章使用链表来实现队列。 如上图所示,就像一个自来水管,先进入水管的水先从水龙头出来,即Front位置的元素最先出队列,因为它们…

去掉viewstate保持在页面中的一大串字符的方法

去掉<input type"hidden" name"__VIEWSTATE" id"__VIEWSTATE" value 后面好多~。。。。在顶部中加入 EnableViewState"false" &#xff0c;就可以去掉了&#xff0c;前提是你用不到它 &#xff0c;我加了EnableViewState"fals…

链表队列初始化

队列初始化 初始化主要是对为队列中的两个重要节点分配空间&#xff0c;这里我们需要注意的是初始化时头指针和尾指针指向同一个节点。 代码如下&#xff1a; status initQueue(LinkQueue* que) { //初始化队列que->headque->rear(QueuePtr)malloc(sizeof(QNode));if(…

链表队列入队算法

循环队列入队伪算法讲解 两步完成: 1.将值存入r所代表的位置 2.错误的写法rr1; 正确的写法是:r(r1)%数组的长度 入队操作 一定要搞清指针的概念。 首先rear和head指向同一个元素。然后&#xff0c;我们使rear的next指向新元素&#xff0c;这样rear指向的元素&#xff08;即1&am…

Android 内存优化测试(转)

今天做了个内存优化的小测试&#xff0c;包括两点 1&#xff0c; 比较Drawable与Bitmap占用内存大小 2&#xff0c; 比较BitmapFactory类的decodeResource方法与decodeStream方法的效率 好吧&#xff0c;先来看第1个测试&#xff01; 以下这个是测试加载1000个Drawable对象的…

链表队列出队算法

出队操作 我们来思考这个过程&#xff0c;在下图队列中&#xff0c;我们出队的第一个元素是元素A&#xff0c;不是1。&#xff08;因为1不是插入进来了的&#xff0c;而是我们初始化时就有的&#xff09;。我们首先让*t等于head的next&#xff0c;即元素A。然后修改head的next指…

英语字根

上初中的时候我的英语一直是年纪排行前三名的&#xff0c;结果上了高中后&#xff0c;分了理科和文科。进了理科班后&#xff0c;我主攻了数学&#xff0c;英语学习渐渐力不从心。一直坚持每天背诵20个英语单词&#xff0c;死记硬背的我总是坚持不下来了。。。到了大学学了计算…

链表队列回收队列

回收队列 回收可以快速取消队列&#xff0c;方法是让头尾碰面即可。 status destoryQueue(LinkQueue* que) { //回收队列if(que->head){que->rear que->head->next;free(que->head);que->headque->rear;}return OK; } 遍历队列和测试方法 提供一个简…

String path = request.getContextPath(....拼装当前网页的相对路径

原文地址 <%String path request.getContextPath();String basePath request.getScheme()"://"request.getServerName()":"request.getServerPort()path"/";%> 这个语句是用来拼装当前网页的相对路径的。<base href"..."&g…

数据库优化 - MYSQL优化

判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断&#xff1a; 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长 应用的日志出现超时等错误 可以使用sar命令&#xff0c;top命令查看当前系统状态。 也可以通过Prometheus、Grafana等监控工具观察系统状态。&a…

ofbiz 定义

OFBiz概述 OFBiz 是开放的电子商务平台&#xff0c;是一个非常著名的开源项目&#xff0c;提供了创建基于最新J2EE/XML规范和技术标准&#xff0c;构建大中型企业级、跨平台、跨数据库、跨应用服务 器的多层、分布式电子商务类WEB应用系统的框架。 OFBiz最主要的特点是OFBiz提供…

队列入队和出队程序演示

#include <stdio.h> #include <string.h> #include <malloc.h>typedef struct Queue {int * pBase;int front;int rear;} QUEUE;void init(QUEUE *); bool en_queue(QUEUE *pQ, int val); //入队 void traverse_queue(QUEUE * pQ); bool full_queue(QUEUE…

图的遍历DFS与BFS(邻接表)

#include "stdafx.h" #include <iostream> #include <fstream> #include <queue> #include <Windows.h>using namespace std;#define INFINITY INT_MAX #define MAX_VERTEX_NUM 20 //顶点最多个数 #define LENGTH 5 //顶点字符长…

递归求n的阶层算法实现

专题:递归 定义:一个函数自己直接或间接调用自己 递归满足三个条件 1、递归必须得有-一个明确的中止条件 2、该函数所处理的数据规模必须在递减 3、这个转化必须是可解的 #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib…

IOS各种文件描述

http://wg2009perfect.blog.163.com/blog/static/12799766320120513954711/转载于:https://www.cnblogs.com/qiqibo/archive/2012/08/15/2639508.html

递归求1到100的和算法演示

循环和递归 递归:易于理解、速度慢、存储空间大 循环&#xff1a;不易理解、速度快、存储空间小 #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h>long sum_sum(int n) {if (1 n) {return 1;}else {int sum n sum…

Terasoluna(中文)

1、靶期业务及框架基本处理流程 整体来看&#xff0c;靶期业务业务处理流程可分为三个环节&#xff1a; 前处理(Job前处理)->主处理(主要业务)->后处理(Job后处理)。 其中&#xff0c;前处理可能是取得靶期日付或者一些执行主处理前的准备工作&#xff0c;后处理主要是靶…

递归实现汉诺塔程序

[将汉诺塔]这不是线性递归&#xff0c;这是个非线性递归! n1 1 n2 3 n3 7 ................. n64 2的64次方减1 [这是个天文数字&#xff0c;就算世界上最快的计算机也解决不了 汉诺塔的复杂度是2的n次方减一 问题很复杂&#xff0c;恒真正解决问题的编码就…

个人博客发展前景

我最近着手写一个博客 但是发现素材很少 而且各种类型博客已经来了 特别不想有重复的内容 百般纠结呀 求各位的意见 来自 个人博客转载于:https://www.cnblogs.com/xiezewen/archive/2012/08/16/2641111.html

转 ofbiz的webservice接口提供(1)-WSDL的生成

ofbiz的service&#xff1a;这个是ofbiz赖以骄傲的设计方式。她可以将所有内部实体对象的CRUD都使用service的方式提供&#xff0c;不同系统之间可以通过互相调用service来完成业务操作。这种松耦合的方式是很多框架梦寐以求的效果。 在ofbiz4的文档中提到&#xff0c;如果想将…