Java 多态的好处
2016-11-19 10:58
253 查看
什么是多态
面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态的作用:消除类型之间的耦合关系。
现实中,关于多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。
多态存在的三个必要条件
要有继承;要有重写;
父类引用指向子类对象。
package dd20161114_2; /** 父类pet */ public class Pet { public void eat() { System.out.println("吃饭"); } } package dd20161114_2; public class Dog extends Pet { public void eat() { // TODO Auto-generated method stub System.out.println("狗啃骨头"); this.hight=5; } } package dd20161114_2; public class Cat extends Pet{ public void eat() { // TODO Auto-generated method stub System.out.println("猫吃鱼"); } }
三个类,Dog和Cat分别继承了Pet类
package dd20161114_2; public class Master1 { public static void main(String[] args) { //dog对象实例化 Dog dog=new Dog(); eat(dog); //cat对象实例化 Cat cat=new Cat(); eat(cat); //Pet对象实例化 Pet pet=new Dog(); pet=new Cat(); eat(pet); } public static void eat(Pet pet){ pet.eat(); } }
输出结果:
狗啃骨头
猫吃鱼
猫吃鱼
从输出结果中可以看出,eat方法需要传递的参数为Pet的一个对象,但是当我传递它的子类的时候也可以,而且调用了相应的方法。我还可以通过实例化子类对象获得父类声明的对象,调用方法的时候它会自动去找对应子类的方法,这就是对象的向上转型和向下转型
向上转型
父类对象通过子类对象去实例化,实际上就是对象的向上转型。向上转型是不需要进行强制类型转换的,但是向上转型会丢失精度。向下转型
所谓向下转型,也就是说父类的对象可以转换为子类对象,但是需要注意的是,这时则必须要进行强制的类型转换。多态的好处
可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
子代父类实例化,然后就相当于一个父亲有很多儿子,送快递的给这个父亲的儿子送东西,他只需要送到父亲的家就行了,至于具体是那个儿子的,父亲还会分不清自己的儿子么,所以你就不用操心了。
使用多态是一种好习惯
多态方式声明是一种好的习惯。当我们创建的类,使用时,只用到它的超类或接口定义的方法时,我们可以将其索引声明为它的超类或接口类型。它的好处是,如果某天我们对这个接口方法的实现方式变了,对这个接口又有一个新的实现类,我们的程序也需要使用最新的实现方式,此时只要将对象实现修改一下,索引无需变化。
比如Map< String,String> map = new HashMap < String,String>();想换成HashTable实现,可以Map< String,String> map = new HashTable < String,String>();
比如写一个方法,参数要求传递List类型,你就可以用List list = new ArrayList()中的list传递,但是你写成ArrayList list = new ArrayList()是传递不进去的。尽管方法处理时都一样。另外,方法还可以根据你传递的不同list(ArrayList或者LinkList)进行不同处理。
在Java编程思想这本书中有介绍
相关文章推荐
- Java--多态(polymorphic),上下转型,多态好处弊端
- java中,什么是封装,继承,多态和抽象,好处与用法
- 第3章 Java与面向对象——FAQ3.05 什么是多态?有什么好处?
- 0904 Java中的多态的成员访问特点、好处、坏处
- java java面向对象-多态的好处
- 【超经典】Java多态有什么好处?怎样用?
- JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例
- java 多态的好处
- JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例
- 对于父类型引用指向子类型实例的好处(Java多态-简明)
- java-多态
- 以一个方法为例谈Java的多态
- Java之多态
- 黑马程序员----Java中的封装,继承和多态详解
- Java学习笔记---继承和多态
- 黑马程序员-Java继承和多态
- Java学习——继承和多态
- 【java基础】--(1)面向对象特性之多态
- JAVA继承与多态
- 设计模式学习(一):java 面向对象特征:抽象、封装、多态、继承