zoukankan      html  css  js  c++  java
  • java 向上转型和向下转型(2)

    1. 简介

    前一章节我们了解了Java向上转型和向下的简单使用,在该章节主要介绍它们的使用场景和意义。

    2. 示例

    2.1 新建一个电子产品的父类 Electronics:

     1 public class Electronics {
     2 
     3     public void getMarketName(){
     4         System.out.println("All goods come form SN.");
     5     }
     6 
     7     public void getPrice(){
     8         System.out.println("The Price of product is ...");
     9     }
    10 }

    2.2 新建键盘类 Keyboard 和鼠标类Mouse,并且继承父类 Electronics:

    键盘类 Keyboard:

     1 public class Keyboard extends Electronics{
     2     //使用键盘输入
     3     public void input(){
     4         System.out.println("use Keyboard input");
     5     }
     6 
     7     @Override
     8     public void getPrice() {
     9         System.out.println("The price of Keyboard is $20.");
    10     }
    11 }

    鼠标类Mouse:

     1 public class Mouse extends Electronics{
     2     //鼠标移动
     3     public void move(){
     4         System.out.println("move the mouse");
     5     }
     6 
     7     @Override
     8     public void getPrice() {
     9         System.out.println("The price of Mouse is $10.");
    10     }
    11 }

    2.3 情景构建

    假设我们去电子商城买产品,需要一个鼠标和一个键盘。我们可以在购物车中添加电子产品,并且可以通过购物车查看电子产品及数量。

    新建一个购物车类ShopCar:

     1 import java.util.*;
     2 
     3 public class ShopCar {
     4     private List<Electronics> mList = new ArrayList<>();
     5 
     6     // 添加商品
     7     public void add(Electronics electronics){
     8         mList.add(electronics);
     9     }
    10 
    11     // 获取商品数量
    12     public int getSize(){
    13         return mList.size();
    14     }
    15 
    16     // 获取指定商品
    17     public Electronics getListItem(int position){
    18         return mList.get(position);
    19     }
    20 }

    注意点如下:

    在添加商品方法 add(Electronics electronics) 中,参数类型为Electronics,而未使用具体的商品类型,例如Keyboard和Mouse。

    这样写的优势在于只需要创建一个add方法即可满足往购物车中添加商品,不必为所有不同的商品分别创建add方法。

    这里涉及到了向上转型,体现出了向上转型的优势。

    2.4 测试购物车的功能,新建测试类Test:

     1 public class Test {
     2 
     3     private static final int MOUSE = 0;
     4     private static final int KEYBOARD = 1;
     5 
     6     public static void main(String[] args){
     7         //添加进购物车
     8         ShopCar shopcar = new ShopCar();
     9         shopcar.add(new Mouse());        // 向上转型
    10         shopcar.add(new Keyboard());     // 向上转型
    11 
    12         //获取大小
    13         System.out.println("购物车存放的电子产品数量为 ——> "+shopcar.getSize());
    14         System.out.println("-------------------");
    15 
    16         //开始测试Mouse鼠标
    17         Mouse mouse = (Mouse)shopcar.getListItem(MOUSE);  // 向下转型
    18         mouse.move();
    19 
    20         //开始测试Keyboard键盘
    21         Keyboard keyboard = (Keyboard)shopcar.getListItem(KEYBOARD);   // 向下转型
    22         keyboard.input();
    23     }
    24 }

    运行结果和具体说明如下:

    1. 第9、10行的实参为新创建的鼠标和键盘对象,运用了向上转型

    2. 在完成向上转型后,此时购物车中的鼠标和键盘丢失了自身独有的方法,例如鼠标丢失了move方法。

    在实际的使用场景中这是我们不愿意看到的,因此需要向下转型,重新获取丢失的方法,示例代码见第17-18,21-22行。

    3. 说明

    从上面的示例可知,向上转型和向下转型一般需要配合使用。向上转型的意义在于当多个同父对象需要创建某一方法时,

    无需多次重复创建该函数,可以通过类型的向上转换确立统一的参数标准,创建一个统一的方法即可。在向上转型的过

    程中子类实例丢失了自身独有的方法,为了重新获取这些方法,向下转型的出现完美地解决了该问题。

    4. 参考文献

    https://juejin.im/entry/5836a76567f3560065f3fdc2

    https://zhuanlan.zhihu.com/p/34026164

    !!!

  • 相关阅读:
    生成随机《c和指针笔记》让rand更随机一点
    mvcframeworkProgramming ASP.NET MVCFundamentals of ASP.NET MVC(四)Controller
    直线距离uva 11168 Airport(训练指南)
    分量算法poj 1751 Highways 最小生成树之Kruskal(克鲁斯卡尔)算法
    图片对象android学习笔记之使用ClipDrawable
    汇总窗口Visual Studio Watch 窗口技巧汇总
    百度用户百度,来一场华丽的视觉盛宴吧
    Dynamic 动态类型 和双问号??的使用
    C# insert into 一条记录后获取该记录的自动增长列ID
    MVC JsonResult的使用
  • 原文地址:https://www.cnblogs.com/jfl-xx/p/12520750.html
Copyright © 2011-2022 走看看