美文网首页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-多态

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