zoukankan      html  css  js  c++  java
  • java多态~应用~向上转型,向下转型

    java多态~应用~向上转型、向下转型【instanceof】

    1,java多态定义:一个实体具有多种形态。

    2,实现多态的前提:(1)继承(2)重写(3)父类引用指向子类对象

    3,多态应用~向上转型、向下转型

    先打个比方,关于的多态,某些业务场景的使用情况。

    例如,咱是做生意的,为了好看搞起包装纸盒。咱的纸盒可以放糖果、苹果、小卡片。

    (做生意要讲究分门别类。纸盒放了糖果就只放糖果;放苹果只放苹果;放小卡片只放小卡片。)

    向上转型:子类放到父类里。[父类引用指向子类对象]:  纸盒=糖果; 或者 纸盒=苹果; 或者 纸盒=小卡片。

    向下转型:前提是有一个指向子类的父类引用。打比方,咱的礼盒要有东西,向下转型,即要取出来子类,

    要取出来,说明得想有东西:即一个指向子类的父类引用。例子:咱的礼盒放了糖果,【礼盒=糖果】,向下转型,取出子类~糖果:糖果=(糖果)礼盒

    4,代码例子:多态这方面的具体应用:包括了一个工厂模式:

    咱就以咱的纸盒、糖果、苹果、小卡片为例子举个工厂模式的例子:

    ❀interface PaperBox

    package DownwardTransition;
    /**纸盒接口
     * @author Huangyujun
     *
     */
    public interface PaperBox {
    
    }

    ❀class Apple

    package DownwardTransition;
    /**
     * 苹果类
     * @author Huangyujun
     *
     */
    public class Apple implements PaperBox {
        public void sendApple() {
            System.out.println("送你个apple");
        }
    }

    class Candy

    package DownwardTransition;
    /**
     * 糖果类
     * @author Huangyujun
     *
     */
    public class Candy implements PaperBox {
        public void sendCandy() {
            System.out.println("吃糖快乐!");
        }
    }

    class Card

    package DownwardTransition;
    /**
     * 卡片类
     * @author Huangyujun
     *
     */
    public class Card implements PaperBox{
        public void sendCard() {
            System.out.println("送你一张小卡片!");
        }
    }

    class SendFactories

    package DownwardTransition;
    
    import java.util.Objects;
    import DownwardTransition.Candy;
    import DownwardTransition.Card;
    import DownwardTransition.Apple;
    import DownwardTransition.PaperBox;
    
    /**
     * 送货工厂
     * @author Huangyujun
     *
     */
    public class SendFactories {
        /**送货啦
         * @param paperBox
         */
        public static void send(PaperBox paperBox) {
            if(Objects.isNull(paperBox)) {             //先判断纸盒是不是空的
                System.out.println("纸盒空空如也,送你个锤子");
                //先判断纸盒是不是装有苹果(纸盒父类指向苹果子类)
                //instanceof 实例的意思 "paperBox instanceof Apple",判断纸盒的实例是否为苹果
            }else if(paperBox instanceof Apple) {     
                ((Apple) paperBox).sendApple();
            }else if(paperBox instanceof Card) {
                ((Card) paperBox).sendCard();
            }else if(paperBox instanceof Candy) {
                ((Candy) paperBox).sendCandy();
            }
        }
    }

    class test

    package DownwardTransition;
    /**
     * 测试类
     * @author Huangyujun
     *
     */
    public class test {
        public static void main(String[] args) {
            PaperBox paperBox = new Apple();        //向上转型
            //调用工厂模式,发货
            SendFactories.send(paperBox);           //内部是向下转型
        }
    }

    测试结果截图:

    总结:向上、向下转型的好处:还是打比方:

    向上转型” 好比做生意时,咱知道了给咱的东西包装个纸盒更容易卖出去,但是纸盒不得要成本吗,我们火速搜索全网,

    发现了一种纸盒看上去包装啥都挺合适的,“包万物的纸盒”,一看价格真香,比较价格时发现,

    与其为每个商品购买其独特的包装礼盒(成本一算太高,不值得),还是“万能大纸盒”香。

    “向上转型”:就是咱的小商品的包装都可以是一个合适它的大纸盒。【父类~大纸盒 指向 子类~某种小商品】

    “向下转型”:就是取出(放了小商品的)大纸盒的小商品 [通过instanceof 判断一下之前放的小商品是什么类型的

    (instanceof 相当于看一下大礼盒的小标签,发现大纸盒放的是啥)]

     
  • 相关阅读:
    微信小程序 iPhone 11、iPhoneX 底部安全区域(底部小黑条)适配
    Servlet与vue-axios交互跨域问题之Access-Control-Allow-Origin' header contains multiple values '*, null', but only one is allowed.
    Windows10下PCL1.8.1以及Python-pcl1.81环境配置的掉发之路
    【问题记录】Navicat Premium连接mysql-8.0.17时出现2059
    mysql-8.0.17解压版安装步骤及MySQL服务无法启动问题的解决办法
    ENVI基本操作之彩色合成
    GeoServer与Udig发布矢量数据出现的问题1——预览数据一半显示正常一半重叠
    本地日志文件
    SQL语句(2)--- 函数
    SQL语句(1)--- SQL简介
  • 原文地址:https://www.cnblogs.com/shan333/p/14948329.html
Copyright © 2011-2022 走看看