开发喵星球

OOP04-多态的梳理和总结

pPeHp90.png pPeHkB4.png

本文内容是多态的梳理和总结,本文内容包括:

多态

什么是多态

多态:

形成多态的条件

形成多态需要具备三个条件

  1. 继承:存在继承关系
  2. 重写:子类重写父类的方法
  3. 指向:父类对象的引用指向子类对象的实例

多态的代码表现形式

示例

需求:

设计:

按照多态的三个条件设计类

  1. 条件1:继承:由于黑白打印机彩色打印机都有打印功能,因此设计父类打印机,在父类中定义打印方法,让黑白打印机和彩色打印机分别继承打印机类。
  2. 条件2:重写:黑白打印机重写父类的打印方法,实现黑白打印。彩色打印机重写父类的打印方法,实现彩色打印。
  3. 条件3:指向:定义父类的引用。
    • 当父类引用指向黑白打印机时,调用的是黑白打印机的打印方法,实现黑白打印。
    • 当父类引用指向彩色打印机时,调用的是彩色打印机的打印方法,实现彩色打印。

代码:

解析:

按照多态的三个条件解析这个例子

  1. 继承:
  2. 黑白打印机继承了打印机,形成的继承关系,满足多态的第一个条件
  3. 彩色打印机继承了打印机,形成的继承关系,满足多态的第一个条件
  4. 重写:

    1. 黑白打印机重写了父类的print()方法,满足多态的第二个条件
    2. 彩色打印机重写了父类的print()方法,满足多态的第二个条件
  5. 指向

    1. 测试类第4行 Printer printer = new Printer(); 父类引用printer指向父类对象,调用print()方法时,调用的是父类的print()方法,输出"打印",如图:

      1692455225606

    2. 测试类第8行 printer = new BlackWhitePrinter(); 父类引用printer不再指向父类对象,而是指向了黑白打印机对象,调用print()方法时,调用的是黑白打印机的print()方法,输出"黑白打印",如图:

      1692455040673

    3. 测试类第12行 printer = new ColorPrinter(); 父类引用printer不在指向黑白打印机,而是指向彩色打印机对象,调用print()方法时,调用的是彩色打印机的print()方法,输出"彩色打印",如图:

      1692455332133

说重点

观察第5行,第9行,第13行,见下图,这三行代码完全相同,但是输出的结果不同,这就是多态。即同一个方法调用,由于对象不同可能会有不同的行为。

这个例子中有三种形态,父类的打印是一种形态,黑白打印机的打印是一种形态,彩色打印机的打印是一种形态。所以每多一个子类对父类方法的重写,就多了一种形态

最后的重点:父类引用指向哪个子类对象,父类引用调用的方法就是它指向的子类的方法。如果子类没有重写父类的方法,那么父类引用调用的就是子类从父类继承的方法,由于子类没有重写父类方法,所以就没有形成新的形态。要想有多态,子类就必须重写父类的方法。

1692455454995

多态的好处

多态的好处是程序容易扩展

比如本例中在增加一种打印机,叫做激光打印机,这种增加就属于多功能的扩展。

你只需要定义激光打印机类,继承打印机类,重写打印方法就可以了。

对于功能的扩展,怎样才算容易扩展呢?

容易扩展的标准是

  1. 不修改原有的代码
  2. 只增加新的代码

满足以上两条就是容易扩展。

那怎样算是不容易扩展呢?

如果要扩展功能,就要大量的修改原有的代码就是不容易扩展的设计。

多态的应用场景

多态的应用场景实在是太广泛了。

比如在JDBC中,在集合中就大量的使用了多态。

鉴于目前的学习进度,在这里举例你也不好理解,在后续的学习过程中,遇到多态的应用场景时,老师会给你讲,期待吧!

目前,这个案例是使用普通类作为父类,大多数情况下,会使用抽象类接口来形成多态。

多态是抽象的,难于理解的,掌握多态需要的是时间,积累,领悟,而非一朝一夕。

多态是一种优雅的设计,融入其中,尽可享受其美妙之处!

晚安,同学们!祝周末愉快!

   
分类:Java/OOP 作者:开发喵 发表于:2023-08-31 13:37:03 阅读量:110
<<   >>


powered by kaifamiao