Java多态性理解
2015-07-29 09:44
435 查看
Java多态性理解
Java中多态性的实现什么是多态
面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。
多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态的作用:消除类型之间的耦合关系。
现实中,关于多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。
下面是多态存在的三个必要条件,要求大家做梦时都能背出来!
多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。
多态的好处:
1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。
一个小题目:
(一)相关类
class A ...{ public String show(D obj)...{ return ("A and D"); } public String show(A obj)...{ return ("A and A"); } } class B extends A...{ public String show(B obj)...{ return ("B and B"); } public String show(A obj)...{ return ("B and A"); } } class C extends B...{} class D extends B...{}
(二)问题:以下输出结果是什么?
A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println(a1.show(b)); ① System.out.println(a1.show(c)); ② System.out.println(a1.show(d)); ③ System.out.println(a2.show(b)); ④ System.out.println(a2.show(c)); ⑤ System.out.println(a2.show(d)); ⑥ System.out.println(b.show(b)); ⑦ System.out.println(b.show(c)); ⑧ System.out.println(b.show(d)); ⑨
(三)答案
① A and A ② A and A ③ A and D ④ B and A ⑤ B and A ⑥ A and D ⑦ B and B ⑧ B and B ⑨ A and D
分类: Java
绿色通道: 好文要顶 关注我 收藏该文与我联系
Jack204
关注 - 1
粉丝 - 32
+加关注
4
0
(请您对文章做出评价)
« 上一篇:甲知道两数之和,⼄知道两数之积,求两数字
» 下一篇:STAR法则
posted @ 2012-10-29 17:53 Jack204 阅读(31030)
评论(9) 编辑 收藏
评论
#1楼 2014-07-30
11:57 | Newzq
您好,对您这个不是很理解,能帮忙讲一下么?QQ:1043576348
支持(0)反对(0)
#2楼 2014-08-28
16:09 | 沧海一滴
总结的很好
支持(0)反对(0)
#3楼 2015-04-03
17:49 | JN-AI
谢谢,明白了
支持(0)反对(0)
#4楼 2015-04-07
11:56 | 五月℃夏到了
很奇怪的是 同样的代码 只不过是C#写的,结果却不一样,求解释。
#5楼 2015-05-06
11:57 | 无知的1234
@五月℃夏到了
对第四个结果尤其不能理解。。求交流,QQ七五41七七322
支持(0)反对(0)
#6楼 2015-06-08
23:28 | naadp
前辈你好,今天拜读了您的这篇文章,感觉很有收获,但对于那9个问题中的6和9不能理解,不知道您能不能在方便的时候解释一下。感激不尽!
支持(0)反对(0)
#7楼 2015-06-22
21:48 | 饭前吃水果
看得云里雾里。为啥和实际运行的结果不一样?还有哪些“...”是什么意思?
支持(0)反对(0)
#8楼 2015-07-12
22:14 | 王爱学志
@五月℃夏到了
java默认直接开启多态(重写).而C#在java基础上加了复写需要abstract
再override.(有点不记得了,C++需要声明为virtual)
而java不需要这些关键字,直接就是多态.这么做的弊端是
父类 fu = new 子类()
fu可是使用子类方法,但不能调用父类同名方法.
但C#和C++是可以的
支持(0)反对(0)
#9楼 2015-07-23
17:36 | 落木、
1.实例对象为A,参数为对象B,B为A的子类。执行A.class中show(A obj)
2.同上
3.实例对象为A,参数为对象D,执行A.class中show(D obj)
4.实例对象依然为A,参数为B,本应执行A.class中show(A obj),但是,B.class重写了show(A obj),所以执行B.class show(A obj)
5.同上
6.执行A.class show(D obj) B中并没有重写。
7,8.实例对象为B,参数为B或者B的子类,执行show(B obj)
9.实例对象为B,参数为D,因为B继承自A,也可以执行A中的show(D obj)
相关文章推荐
- Java学习之多态
- java基础编程中常见的错误(基本类型)
- java.io,PrintWriter可以用来创建一个文件并向本文文件写入数据
- There is no getter for property named in 'class java.lang.String'
- spring ioc原理
- java---json数据处理
- java ---输入输出流操作(代码整理)
- MyEclipse项目出现红色叹号的问题
- Spring MVC(总结)
- struts2 环境配置
- Struts2从一个action转到另一个action的两种方法
- 设置myeclipse编辑区域背景颜色,以及适宜的健康色值
- Eclipse 护眼背景和字体修改,eclipse改背景色
- Spring MVC详解(七) 注解式控制器的数据验证、类型转换及格式化(2)
- JAVA 并发编程-基于线程池设计的ScheduledExecutor(八)
- Spring MVC详解(七) 注解式控制器的数据验证、类型转换及格式化(1)
- java基础入门-float四舍五入保留两位小数注意的地方
- java基础入门-float四舍五入保留两位小数注意的地方
- Spring MVC详解(六)注解式控制器详解(1)
- eclipse打断点调试进入到class文件中--解决方法