您的位置:首页 > 编程语言 > Java开发

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#写的,结果却不一样,求解释。

支持(0)反对(0)


#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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: