前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【设计模式】面向对象 - 多态 ( 面向对象 3 要素 | 多态 提升 程序扩展性 | 多态示例 )

【设计模式】面向对象 - 多态 ( 面向对象 3 要素 | 多态 提升 程序扩展性 | 多态示例 )

作者头像
韩曙亮
发布2023-03-29 17:24:54
4700
发布2023-03-29 17:24:54
举报
文章被收录于专栏:韩曙亮的移动开发专栏

文章目录

一、面向对象 3 要素


面向对象

3

要素 :

封装 : 解决 安全性 问题 ; 通过 private , protected , public 修饰方法 , 变量 , 以保证代码安全性 ;

继承 : 解决 代码重用 问题 ; 子类继承父类 ,

多态 : 解决 程序扩展 问题 ;

二、多态 ( 提升程序扩展性 )


多态有

3

种表现 :

① 子类 重写 父类方法 ;

② 相同方法名 不同参数 的 方法 重载 ;

③ 父类引用 指向 子类对象 ;

面向对象编程时 , 建议 面向接口 编程 ;

如果不使用多态 , 如果 添加新的类 时 , 就需要 修改业务逻辑 , 明显 违反了开闭原则 ;

面向对象中 , 多态发生的条件 :

  • 子类 继承 ( 实现 ) 父类 ;
  • 父类引用 指向 子类对象 ;
  • 子类 重写 父类方法 ;

使用多态后 , JVM 在运行阶段 , 才知道要执行哪个类的方法 ;

三、不使用多态示例


业务场景 : 飞行器飞行 , 飞行器有 直升机 和 运输机 , 每个飞行器都有起飞和降落方法 ;

直升机类 :

代码语言:javascript
复制
public class Helicopter {
    public void takeOff() {
        System.out.println("直升飞机 起飞");
    }

    public void land() {
        System.out.println("直升飞机 降落");
    }
}

运输机类 :

代码语言:javascript
复制
public class TransportPlane {
    public void takeOff() {
        System.out.println("运输机 起飞");
    }

    public void land() {
        System.out.println("运输机 降落");
    }
}

客户端 : 分别为 直升机 Helicopter 和 运输机 TransportPlane 各自定义

1

个方法 ;

代码语言:javascript
复制
public class Client {
    public static void main(String[] args) {
        Client client = new Client();
        client.doFly();
        client.doFly2();
    }

    private void doFly() {
        Helicopter helicopter = new Helicopter();
        helicopter.takeOff();
        System.out.println("飞行");
        helicopter.land();
    }

    private void doFly2() {
        TransportPlane transportPlane = new TransportPlane();
        transportPlane.takeOff();
        System.out.println("飞行");
        transportPlane.land();
    }
}

运行结果 :

在这里插入图片描述
在这里插入图片描述

上述示例中 , 如果要添加新的飞行器 , 战斗机 , 就要定义新的 客户端 Client 方法 , 修改客户端的业务逻辑 ;

这显然违背了 面向对象

7

大设计原则 中的 " 开闭原则 " ;

增加的新的战斗机类 :

代码语言:javascript
复制
public class Fighter {
    public void takeOff() {
        System.out.println("战斗机 起飞");
    }

    public void land() {
        System.out.println("战斗机 降落");
    }
}

客户端修改后的结果 :

代码语言:javascript
复制
public class Client {
    public static void main(String[] args) {
        Client client = new Client();
        client.doFly();
        client.doFly2();
        client.doFly3();
    }

    private void doFly() {
        Helicopter helicopter = new Helicopter();
        helicopter.takeOff();
        System.out.println("飞行");
        helicopter.land();
    }

    private void doFly2() {
        TransportPlane transportPlane = new TransportPlane();
        transportPlane.takeOff();
        System.out.println("飞行");
        transportPlane.land();
    }

    private void doFly3() {
        Fighter fighter = new Fighter();
        fighter.takeOff();
        System.out.println("飞行");
        fighter.land();
    }
}

执行结果 :

在这里插入图片描述
在这里插入图片描述

四、使用多态示例


飞行器接口 :

代码语言:javascript
复制
public interface Aircraft {
    public void takeOff();
    public void land();
}

直升飞机 :

代码语言:javascript
复制
public class Helicopter implements Aircraft {
    @Override
    public void takeOff() {
        System.out.println("直升飞机 起飞");
    }

    @Override
    public void land() {
        System.out.println("直升飞机 降落");
    }
}

运输机 :

代码语言:javascript
复制
public class TransportPlane implements Aircraft {
    @Override
    public void takeOff() {
        System.out.println("运输机 起飞");
    }

    @Override
    public void land() {
        System.out.println("运输机 降落");
    }
}

客户端类 :

代码语言:javascript
复制
public class Client {
    public static void main(String[] args) {
        Client client = new Client();

        Aircraft aircraft1 = new Helicopter();
        Aircraft aircraft2 = new TransportPlane();

        client.doFly(aircraft1);
        client.doFly(aircraft2);
    }

    private void doFly(Aircraft aircraft) {
        aircraft.takeOff();
        System.out.println("飞行");
        aircraft.land();
    }
}

执行结果 :

在这里插入图片描述
在这里插入图片描述

添加战斗机类 , Client 中的相关方法不用修改 ;

添加的战斗机类 :

代码语言:javascript
复制
public class Fighter implements Aircraft {
    @Override
    public void takeOff() {
        System.out.println("战斗机 起飞");
    }

    @Override
    public void land() {
        System.out.println("战斗机 降落");
    }
}

修改后的客户端类 :

代码语言:javascript
复制
public class Client {
    public static void main(String[] args) {
        Client client = new Client();

        Aircraft aircraft1 = new Helicopter();
        Aircraft aircraft2 = new TransportPlane();
        Aircraft aircraft3 = new Fighter();

        client.doFly(aircraft1);
        client.doFly(aircraft2);
        client.doFly(aircraft3);
    }

    private void doFly(Aircraft aircraft) {
        aircraft.takeOff();
        System.out.println("飞行");
        aircraft.land();
    }
}

执行结果 :

在这里插入图片描述
在这里插入图片描述

总结


多态作用 : 提升程序扩展性 ;

多态

3

种表现 : ① 子类 重写 父类方法 ; ② 相同方法名 不同参数 的 方法 重载 ; ③ 父类引用 指向 子类对象 ;

多态发生

3

条件 : ① 子类 继承 ( 实现 ) 父类 ; ② 父类引用 指向 子类对象 ; ③ 子类 重写 父类方法 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、面向对象 3 要素
  • 二、多态 ( 提升程序扩展性 )
  • 三、不使用多态示例
  • 四、使用多态示例
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档