• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
火磷
Memory will fade,but not notes.
博客园    首页    新随笔    联系   管理    订阅  订阅
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

!!!

 

posted on 2020-03-19 10:02  火磷  阅读(269)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3