Java 多态性理解

2015-05-12  来源:本站原创  分类:源码分析  人气:1704 

什么是多态

  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。真的给绕进去了。

相关文章
  • Java 多态性理解 2015-05-12

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

  • Java深度理解--Java字节代码的操纵 2012-01-13

    导读:Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展.但是对于 Java语言的深度理解和运用,毕竟是很少会有人涉及的话题.InfoQ中文站特地邀请IBM高级工程师成富为大家撰写这个<Java深度历险>专栏,旨在就Java的一些深度和高级特性分享他的经验. 在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行 Java 程序就可以了

  • java变量理解 2013-01-12

    java中变量分两种类型:基本变量和引用变量 其中基本变量细分为:数值类型,字符类型(char),布尔类型(boolean) 引用变量细分为:类类型,接口类型,数组类型 其中数值类型有分为整型和浮点型: 具体如下: 整型有:byte(占一个字节) short(二个字节) int(四个字节) long(八个字节) 浮点型: float(四个字节) double(八个字节) 注:引用变量(占用四个字节) 变量我们关注它什么,我简称四要素: 变量类型: 变量存贮位置: 变量作用域: 变量生命周期: 但

  • 从开发者(Java)角度理解Request和Response 2013-11-02

    背景知识: 超文本传输协议 (HTTP-Hypertext transfer protocol) :一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议. 七层网络协议: 应用层协议包括:HTTP.FTP.Telnet.SMTP.RIP.NFS.DNS:TCP/UDP协议属于传输层协议:IP协议属于网际层. 深入理解一方面知识之前最好能够理清知识的结构,然后再对症寻医. 正文: 从开发角度上,我们主要从"七层网络协议"中应用层协议的"H

  • Java多态性 2013-12-07

    多态性:发送消息给某个对象,让该对象自行决定响应何种行为. 通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用. java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法. 1. 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类. 2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例. // pu

  • Java视角理解系统结构 2013-04-26

    今天看的文章,不错,记录下 http://ifeve.com/from-javaeye-sys-struct/ http://www.ibm.com/developerworks/java/library/j-codetoheap/index.html 基础知识,做java的了解下

  • JAVA:认识理解Java中的native方法 2014-06-27

    今天在看ArrayList的java源码时看到,其中的一个public Object clone()克隆方法: /** * Returns a shallow copy of this <tt>ArrayList</tt> instance. (The * elements themselves are not copied.) * * @return a clone of this <tt>ArrayList</tt> instance */ public

  • JAVA技术之深入详解多态性 2014-03-31

    引言:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定.因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性.多态性增强了软件的灵

  • 三.Java的多态性 2013-12-26

    3.1 多态性的含义 通过类型转换,把一个对象当作它的基类对象对待. 从相同的基类派生出来的多个派生类可被当作同一个类型对待,可对这些不同的类型进行同样的处理. 测试例子: [java] view plaincopy public class Game { public void play() { } } class Football extends Game { @Override public void play() { System.out.println("踢足球"); sup

  • java的多态性 2014-12-28

    多态性是通过: 1 接口和实现接口并覆盖接口中同一方法的几不同的类体现的 2 父类和继承父类并覆盖父类中同一方法的几个不同子类实现的. 一.基本概念 多态性:发送消息给某个对象,让该对象自行决定响应何种行为.通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用. java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法. 1. 如果a是类A的一个引用,

  • JAVA 多态 由浅及深介绍 2014-09-11

    JAVA 多态 由浅及深介绍,什么是多态?多态的详细解释,多态的好处,多态的实际运用等 什么是多态? 多态分两种: (1) 编译时多态(设计时多态):方法重载. (2) 运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态.(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态) 运行时多态存在的三个必要条件: 一.要有继承(包括接口的实现): 二.要有重写: 三.父类引用指向子类对象. -----------------------------

  • Java编程思想重点笔记(Java开发必看) 2014-11-11

    Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理解题(比如is-a关系和has-a关系的区别),也有深入的涉及RTTI和JVM底层反编译知识. 1. Java中的多态性理解(注意与C++区分) Java中除了static方法和final方法(private方法本质上属于final方法,因为不能被子类访问)之外,其它所有的方法都是动态绑定,这意味着

  • java面试题及答案(基础题122道,代码题19道) 2012-11-06

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类 继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(

  • 转载java面试 2013-10-15

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父

  • 经典java面试题 2013-11-05

    一. java基础 1. 面向对象的特征有哪些方面? a.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. b.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(

  • JAVA相关基础知识 2014-07-27

    JAVA相关基础知识 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父

  • 探讨Java中最常见的十道面试题(超经典) 2013-10-08

    本篇文章是对Java中最常见的十道面试题进行了详细的分析介绍,需要的朋友参考下 第一,谈谈final, finally, finalize的区别. final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为final,可以保证它们在使用中不被改变.被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改.被声明为final的方法也同样只

  • Java基础之如何学好Java 2013-11-17

    这篇文章已经是有数年"网龄"的老文,不过在今天看来仍然经典.如何学习java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领域其他技能的学习. Java是个平台,我只想说说我对学好Java的一点看法,希望对初学者有所帮助. 1. 思考一下 学习Java之前,先别急,静下心来好好想想: 1)你对学习Java是否有兴趣? 2)你是否能静下心来坚持不懈地学习? 嗯,这是个容易但又绝对不应该忽略的问题,你确信自己对Java感兴趣.而且又

  • Java overload和override的区别分析 2013-12-19

    方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现,想要了解更多请参考本文 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现.重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个类中多态性的一种表现. 如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding).子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义

  • Java Learning Path(二).书籍篇 2014-03-01

    学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握.需要有一个循序渐进的阅读过程.我推荐Oreilly出版的Java系列书籍. 在这里我只想补充一点看法,很多人学习Java是从<Thinking in Java>这本书入手的,但是我认为这本书是不适合初学者的.我认为正确的使用这本书的方法应该是作为辅助的读物.<Thinking in Java>并不是在完整的介绍Java的整个体系,而是一种跳跃式的写作方法,是一种类似tips的方法来对Java很多知识点进行了深入的分析和