AD

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

相关文章

  1. Java深度理解--Java字节代码的操纵

    导读:Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展.但是对于 Java语言的深度理解和运用,毕竟是很少会有人涉及的话题.InfoQ中文站 ...
  2. java变量理解

    java中变量分两种类型:基本变量和引用变量 其中基本变量细分为:数值类型,字符类型(char),布尔类型(boolean) 引用变量细分为:类类型,接口类型,数组类型 其中数值类型有分为整型和浮点型: 具体如下: 整型 ...
  3. 从开发者(Java)角度理解Request和Response

    背景知识: 超文本传输协议 (HTTP-Hypertext transfer protocol) :一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议. 七层网络协议: 应用层协 ...
  4. Java多态性

    多态性:发送消息给某个对象,让该对象自行决定响应何种行为. 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用. java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量 ...
  5. Java视角理解系统结构

    今天看的文章,不错,记录下 http://ifeve.com/from-javaeye-sys-struct/ http://www.ibm.com/developerworks/java/library/j-codet ...
  6. JAVA:认识理解Java中的native方法

    今天在看ArrayList的java源码时看到,其中的一个public Object clone()克隆方法: /** * Returns a shallow copy of this <tt>ArrayLi ...
  7. JAVA技术之深入详解多态性

    引言:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须 ...
  8. 三.Java的多态性

    3.1 多态性的含义 通过类型转换,把一个对象当作它的基类对象对待. 从相同的基类派生出来的多个派生类可被当作同一个类型对待,可对这些不同的类型进行同样的处理. 测试例子: [java] view plaincopy p ...
  9. java的多态性

    多态性是通过: 1 接口和实现接口并覆盖接口中同一方法的几不同的类体现的 2 父类和继承父类并覆盖父类中同一方法的几个不同子类实现的. 一.基本概念 多态性:发送消息给某个对象,让该对象自行决定响应何种行为.通过将子类对 ...
  10. JAVA 多态 由浅及深介绍

    JAVA 多态 由浅及深介绍,什么是多态?多态的详细解释,多态的好处,多态的实际运用等 什么是多态? 多态分两种: (1) 编译时多态(设计时多态):方法重载. (2) 运行时多态:JAVA运行时系统根据调用该方法的实例 ...
  11. Java编程思想重点笔记(Java开发必看)

    Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理解题(比如is-a关 ...
  12. java面试题及答案(基础题122道,代码题19道)

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽 ...
  13. 转载java面试

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽 ...
  14. 经典java面试题

    一. java基础 1. 面向对象的特征有哪些方面? a.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节. ...
  15. JAVA相关基础知识

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽 ...
  16. 探讨Java中最常见的十道面试题(超经典)

    本篇文章是对Java中最常见的十道面试题进行了详细的分析介绍,需要的朋友参考下 第一,谈谈final, finally, finalize的区别. final?修饰符(关键字)如果一个类被声明为final,意味着它不能再 ...
  17. Java基础之如何学好Java

    这篇文章已经是有数年"网龄"的老文,不过在今天看来仍然经典.如何学习java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领域其他技能的学习. ...
  18. Java overload和override的区别分析

    方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现,想要了解更多请参考本文 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现.重写(O ...
  19. Java Learning Path(二).书籍篇

    学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握.需要有一个循序渐进的阅读过程.我推荐Oreilly出版的Java系列书籍. 在这里我只想补充一点看法,很多人学习Java是从<Thinking in ...