jdk

[Java]重学Java-多态

2021-08-20  本文已影响0人  AbstractCulture

从一个例子理解多态

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

多态

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

实战多态

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

UML

定义接口

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();
}

定义不同的实现类

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("办理信用卡送无线耳机");
    }
}
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("办理信用卡送行李箱");
    }
}
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编程思想》

上一篇下一篇

猜你喜欢

热点阅读