接着我们写一个测试类 Test 去测试购物车里的电子产品。
  测试类 Test 如下:
public class Test{
public static final int THINKPAD = 0;
public static final int MOUSE = 1;
public static final int KEYBOARD = 2;
public static void main(String[] args){
//添加进购物车
ShopCar shopcar = new ShopCar();
shopcar.add(new Thinkpad());
shopcar.add(new Mouse());
shopcar.add(new Keyboard());
//获取大小
System.out.println("购物车存放的电子产品数量为 ——> "+shopcar.getSize());
//开始测试thinkpad电脑
Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD);
thinkpad.boot();
thinkpad.program();
System.out.println("-------------------");
//开始测试Mouse鼠标
Mouse mouse = (Mouse)shopcar.getListItem(MOUSE);
mouse.move();
mouse.onClick();
System.out.println("-------------------");
//开始测试Keyboard键盘
Keyboard keyboard = (Keyboard)shopcar.getListItem(KEYBOARD);
keyboard.input();
}
}
  举个例子分析好
  //开始测试thinkpad电脑
  Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD);
  thinkpad.boot();
  thinkpad.program();
  shopcar.getListItem(THINKPAD) 这句代码是获取到Electronics类型的实例。不是Thinkpad的实例
  通过向下转型,赋值给子类引用
  Thinkpad thinkpad = (Thinkpad)shopcar.getListItem(THINKPAD);
  这样子类实例又重新获得了因为向上转型而丢失的方法(boot 和program)
  总结一下吧,很多时候,我们需要把很多种类的实例对象,全部扔到一个集合。(这句话很重要)
  在这个例子里是把Thinkpad笔记本,Mouse鼠标,KeyBoard键盘等实例对象,全部扔到一个Shopcar购物车集合。
  但是肯定不可能给他们每个种类都用一个独立的集合去存放吧,这个时候我们应该寻找到一个标准,接口是一个标准。这些都是各种电子产品,抽象成电子产品。然后一个Electronics接口出来了。
  在回到刚才,我们把很多种类的实例对象全部扔到一个集合。或许这样比较好理解:把很多种类的子类实例对象全部扔到存放父类实例的集合。
  经过了这个过程,子类实例已经赋值给了父类引用(即完成了向上转型),但很遗憾的丢失了子类扩展的方法。
  很好的是Java语言有个向下转型的特性,让我们可以重新获得丢失的方法,即强转回子类
  所以我们需要用到子类实例的时候,从那个父类集合里拿出来向下转型可以了,一样可以使用子类实例对象
  ……
  我在搜索java向下转型的意义时,得到一个比较好的答案是这样的:
  大的用处是java的泛型编程,用处很大,Java的集合类都是这样的。
  而在Android开发中,我们在Layout文件夹,用xml写的控件。为什么能在Activity等组件中通过 findViewById() 方法找到呢?为什么 findViewById(R.id.textview) 方法传入TextView的id后,还要转型为TextView呢?这是 Java 向下转型的一个应用