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

!!!

原文地址:https://www.cnblogs.com/jfl-xx/p/12520750.html