美文网首页jdk
[Java]重学Java-多态

[Java]重学Java-多态

作者: AbstractCulture | 来源:发表于2021-08-20 17:42 被阅读0次

从一个例子理解多态

对于一个不同特征的对象,使用接口可以隐藏子类的行为,对外暴露同一个接口,从而实现编程的解耦.

多态

当然,这不一定是要用接口来实现,使用继承也是可以的。
这里我们其实也可以简单用if-else这样的结构来进行判断分发。
但是多态提供了高扩展性,如果此时再来一个广发银行,只需要实现银行这个接口,即可很好的扩展了,在运行时,JVM通过类型判断类决定调用哪个类的方法.

实战多态

现在我们来把上面的需求实现一下。

UML

定义接口

  • IBank
package com.tea.modules.java8.oop.polymorphism;

/**
 * com.tea.modules.java8.oop.polymorphism <br>
 * 银行接口
 * @author jaymin
 * @since 2021/7/1
 */
public interface IBank {

    /**
     * 办理信用卡
     */
    void applyCreditCard();
}

定义不同的实现类

  • ZSBank
package com.tea.modules.java8.oop.polymorphism;

/**
 * com.tea.modules.java8.oop.polymorphism <br>
 * 招商银行
 * @author jaymin
 * @since 2021/7/1
 */
public class ZSBank implements IBank{

    @Override
    public void applyCreditCard() {
        System.out.println("办理信用卡送无线耳机");
    }
}
  • ChineseBank
package com.tea.modules.java8.oop.polymorphism;

/**
 * com.tea.modules.java8.oop.polymorphism <br>
 * 中国银行
 *
 * @author jaymin
 * @since 2021/7/1
 */
public class ChineseBank implements IBank {
    @Override
    public void applyCreditCard() {
        System.out.println("办理信用卡送行李箱");
    }
}
  • PFBank
package com.tea.modules.java8.oop.polymorphism;

/**
 * com.tea.modules.java8.oop.polymorphism <br>
 * 浦发银行
 * @author jaymin
 * @since 2021/7/1
 */
public class PFBank implements IBank{

    @Override
    public void applyCreditCard() {
        System.out.println("办理信用卡送MP4");
    }
}

Demo

package com.tea.modules.java8.oop.polymorphism;

/**
 * com.tea.modules.java8.oop <br>
 * 理解多态
 * @author jaymin
 * @since 2021/7/1
 */
public class Polymorphism {

    /**
     * 传入实现同一个接口的不同实例,触发不一样的效果
     * @param args
     */
    public static void main(String[] args) {
        applyCreditCard(new PFBank());
        applyCreditCard(new ChineseBank());
        applyCreditCard(new ZSBank());
    }

    private static void applyCreditCard(IBank bank){
        bank.applyCreditCard();
    }
}

Result

办理信用卡送MP4
办理信用卡送行李箱
办理信用卡送无线耳机

回顾继承

对于继承来说,也可以在方法上声明传入基类,然后传入不同的子类实例来实现多态,这属于"向上转型"。
在我的文章中,有对这种动态绑定的现象做了解释: 点我前往

面向接口编程

接口-interface将对象之间传递消息与实现的逻辑进行了解耦,这样在做替换的时候,对于上层的调用方来说是无感的。

一些多态的陷阱

  1. 无法重写private方法.
  2. static方法不具备多态性,原因是static只跟类有关,与对象无关,多态是对象的行为.
  3. 切记子类和父类不要定义一样名称的field.

总结

  1. 类可以实现多个接口,但是继承只能是单个继承的.
  2. 继承和接口都可以实现多态,多态是一种思想,而不是具体的某个表现.
  3. 为了在程序中有效地使用多态乃至面向对象的技术,就必须扩展自己的编程视野,不能只看到单一类中的成员和消息,而要看到类之间的共同特性和它们之间的关系。尽管这需要很大的努力,但是这么做是值得的。它能带来更快的程序开发、更好的代码组织、扩展性更好的程序和更易维护的代码。

但是记住,多态可能被滥用。仔细分析代码以确保多态确实能带来好处。

以上语录摘自《Java编程思想》

相关文章

  • [Java]重学Java-多态

    从一个例子理解多态 对于一个不同特征的对象,使用接口可以隐藏子类的行为,对外暴露同一个接口,从而实现编程的解耦. ...

  • Java-多态

    面向对象的程序设计语言的三大特征是:抽象、继承、多态 封装通过合并特征和行为来创建新的数据类型。实现隐藏则通过将私...

  • Hello Java

    目录 Java-基础(1/6) Java-对象(2/6) Java-核心库类 上(3/6) Java-核心库类下(...

  • [Java]重学Java-继承

    复用 随着码代码的时间增长,程序员会越发需要"复用"这个能力,比如最简单的对String类进行判空: 我们需要每次...

  • [Java]重学Java-集合

    容器 很多时候,我们写程序需要进行批量的操作,比如说,新增一批学生列表.那么就需要有容器来装下这10个对象。Jav...

  • [Java]重学Java-接口

    接口是什么 首先接口不是类,它本身是无法被实例化的,只有实现类可以被实例化。它更像是一种功能的描述,程序输入什么值...

  • Java-基础-多态

    在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写(Override)Person类 Stu...

  • [Java]重学Java-可变参数

    可以变动的参数数量 编程离不开写方法(函数),Java中的大多数方法都是固定数量的参数,JDK5提供了可变参数来让...

  • [Java]重学Java-枚举类

    枚举可以做什么 假设我们现在想表达星期,为了避免魔法值的出现,我们可能会写一个常量类: 这样一来,1-7的星期数就...

  • [Java]重学Java-内部类

    什么是内部类 一个类中定义了另一个类,被定义的类叫作内部类。内部类可以将逻辑隐藏,使用好修饰符可以让实现逻辑对外隔...

网友评论

    本文标题:[Java]重学Java-多态

    本文链接:https://www.haomeiwen.com/subject/mrgtiltx.html