面向对象 多态

xiaoxiao2021-02-28  113

多态

   面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。

   概念

        -是指同一操作作用于某一类对象,产生不同的执行结果

    体现

        -父类或接口的引用变量可以引用其子类的对象

    前提

        -需要继承或实现

    实现多态的技术称为

        -动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

 作用

   -通过分离做什么和怎么做,将接口和实现进行分离

   -消除了类型之间的耦合关系

   -提高了程序的扩展性和后期的可维护性

    多态的好处:

        -可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。

        -可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。

        -接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如CircleSphere为了实现多态,完善或者覆盖这两个接口方法。

        -灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。

        -简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。

    对象上下转型

      -由子类型转成父类,称为向上转型

       -向上转型是一个较专业类型向较通用类型转换,所以总是安全的

       -对于向上转型,调用的变量是父类的变量,调用的方法是子类的方法

eg:

      -与之相反的是向下转型,不安全(可能需要instanceof操作符协助)

        -instanceof运算符用来指出对象是否是特定类或者是它的子类的一个实例,返回值是布尔值

        -用法:   boolean result = object instanceof class;

                       如果object是class或其子类的一个实例,返回true,如果不是或object为null,返回false

        -多态的概念基于对象引用的动态绑定特性

     多态应用

eg:

*打印机的实例,同一个实现接口,实现彩色打印机和黑白打印机的输出

public class PrinterDemo { /** * 多态应用  * 同一个实现接口,实现多态 * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub String content = "Hello,java!"; School school = new School(); BlackPrinter bp = new BlackPrinter("惠普"); school.setPrinter(bp); school.print(content); ColorPrinter cp = new ColorPrinter("戴尔"); school.setPrinter(cp); school.print(content); } } class School { //多态 :同一个实现接口,接收不同的对象,调用相同的方法,执行不同的结果 //越抽象的东西越稳定 private Printer p = null; public void setPrinter(Printer p){ this.p = p;//向下转型 } public void print(String content){ p.print(content); } } class Printer { private String brand;//品牌 public Printer(String brand) { this.brand = brand; } public String getBrand() { return brand; } public void print(String content) {

        } } class BlackPrinter extends Printer { public BlackPrinter(String brand) { super(brand); } //重写父类的方法 @Override public void print(String content) { System.out.println(getBrand() + "黑白打印机,打印:" + content); } } class ColorPrinter extends Printer { public ColorPrinter(String brand) { super(brand); } //重写父类的方法 @Override public void print(String content) { // TODO Auto-generated method stub System.out.println(getBrand()+"彩色打印机,打印:"+content); } }

转载请注明原文地址: https://www.6miu.com/read-25753.html

最新回复(0)