Java 多态性理解

什么是多态

  1. 面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。
  2. 多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
  3. 实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型根据其实际的类型调用其相应的方法。特别注意:当所引用的类型存在继承关系时候,会结合参数的类型,选择相应的方法。可以结合后面的参数例子来看。
  4. ?


    1

    System.out.println(b.show(d)); //a d
  5. 多态的作用:消除类型之间的耦合关系。
  6. 现实中,关于多态的例子不胜枚举。比方说按下 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中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。

实例:A 类

?


1

2

3

4

5

6

7

8

9

10

package com.yuan.test;

public class A {

public String show(D obj){

return ("A and D");

}

public String show(A obj){

return ("A and A");

}

}

实例:B类

?


1

2

3

4

5

6

7

8

9

10

package com.yuan.test;

class B extends A{

public String show(B obj){

return ("B and B");

}

public String show(A obj){

return ("B and A");

}

}

实例 C类

?


1

2

3

4

5

package com.yuan.test;

public class C extends B{

}

实例 D类

?


1

2

3

4

5

package com.yuan.test;

public class D extends B{

}

测试类:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

package com.yuan.test;

public class ABCD {

public static void main(String[] args) {

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)); //a a

System.out.println(a1.show(c)); //a a

System.out.println(a1.show(d)); //a d

System.out.println(a2.show(b)); // b a

System.out.println(a2.show(c)); // b a

System.out.println(a2.show(d)); // a d

System.out.println(b.show(b));//b b

System.out.println(b.show(c)); //b b

System.out.println(b.show(d)); //a d

}

}

第四个输出 是因为A 类型中没有show(B obj) 的方法,所以调用的是show(A object)的方法。
又因为是B的实例,B重写了show(A object),所以最后是 B A。真的给绕进去了。

分类:源码分析 时间:2015-05-12 人气:1007
本文关键词: 多态
分享到:

相关文章

iOS 开发

Android 开发

Python 开发

JAVA 开发

开发语言

PHP 开发

Ruby 开发

搜索

前端开发

数据库

开发工具

开放平台

Javascript 开发

.NET 开发

云计算

服务器

Copyright (C) codeweblog.com, All Rights Reserved.

CodeWeblog.com 版权所有 闽ICP备15018612号

processed in 0.064 (s). 12 q(s)