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
!!!