老贴地址:http://topic.csdn.net/t/20050816/19/4212545.html
for each循环的一个奇怪现象!楼主ankyhe()2005-08-16 19:25:58 在 Java / J2SE / 基础类 提问
看下面这段代码:   
  class   Employee{   
  }   
  class   Manager   extends   Employee{   
  }   
  public   class   InheritanceTest   {   
          public   static   void   main(String[]   args)   {   
                  Manager[]   ms   =   new   Manager[10];   
                  Employee[]   es   =   ms;   
                  for(int   i   =   0   ;   i   <   es.length;   ++i)   
                          es[i]   =   new   Employee();   
                          
          }   
  }   
  这样可以编译,但是在运行时会有一个ArrayStoreException异常。   
  但是如果将代码改为   
  class   Employee{   
  }   
  class   Manager   extends   Employee{   
  }   
  public   class   InheritanceTest   {   
          public   static   void   main(String[]   args)   {   
                  Manager[]   ms   =   new   Manager[10];   
                  Employee[]   es   =   ms;   
                  for(Employee   elem:ms)   
                            elem   =   new   Employee();   
                          
          }   
  }   
  可以顺利通过编译运行,一点异常都没有。   
  请问这两种写法有什么不同吗,为什么结论不一样?    
问题点数:20、回复次数:4
1 楼kingfish(工作很忙,很少来csdn...)回复于 2005-08-16 19:37:17 得分 0 第一种由于向Manager数组中写入Employee,所以报错   
  第二种根本就不会存入到数组,所以没报错
2 楼ankyhe()回复于 2005-08-16 20:02:13 得分 0 这两种写法不是一样的意思嘛,kingfish能不能解释的清楚些?
3 楼kingfish(工作很忙,很少来csdn...)回复于 2005-08-16 20:15:34 得分 20你可以把for   each后数组内容打出来看看,应该都是null   
    
  第二种大致相当与:   
          Employee   elem   =   null;   
          for   (int   i   =   0;   i   <   ms.length;   ++i)   {   
              elem   =   ms[i];   
              elem   =   new   Employee();   
          }
4 楼ankyhe()回复于 2005-08-16 20:26:36 得分 0 明白了,谢谢啊!个人意见:造成这个问题的主要原因就是:没有显示地初始化Manager[] 数组!~ 等待高手详解!~~

解决方案 »

  1.   

    赞成:1   楼kingfish(工作很忙,很少来csdn...)回复于   2005-08-16   19:37:17   得分   0   第一种由于向Manager数组中写入Employee,所以报错       
        第二种根本就不会存入到数组,所以没报错 
      

  2.   

    前者:es[i]实际所指的是ms[i]中的一个位置,这个位置只能放子类 Manager
    后者:elem并非指向ms中的某个位置,而是一个普通的Employee类型的变量,自然可以放超类的Employee,其“本质”如下class Employee {
    }class Manager extends Employee {
    }class InheritanceTest {
    public static void main(String[] args) {
    Manager[] ms = new Manager[10];
    Employee[] es = ms;
    for (int i = 0; i < es.length; ++i) {

    Employee elem = es[i];
    elem = new Employee();

    }
    }
    }晕,旧帖3楼回答得很清楚了……