我在看JAVA核心技术继承这一章时 有一段没看明白,先上代码:Manager[] managers = new Manager[10];Employee[] staff = managers;这样做肯定不会有问题,因为经理也是一名雇员,但是,编译器接受如下操作:staff[0]= new  Employee("harry"),书中说 "staff[0]和manager[0]引用的是同一对象,这样操作似乎把每一位雇员都当作经理了,当调用manager[0].setBonus(1000)时,将导致访问一个不存在的实例域,进而扰乱相邻存储空间的内容"ps:setBonus是经理类独有的方法,雇员没有。我的问题是 manager[0].setBonus 为什么会出现上述现象 它不是调用自己类的方法吗?

解决方案 »

  1.   

    在Employee[] staff = managers; 赋值以后,staff和managers指向同一段内存对象,内部类型是manager,在staff赋值以后, staff[0]其实是一个employee的类型,这个时候这个数组的类型已经不是完全一致了,而如果直接调manager[0].setBonus实际上调用的是new  Employee("harry")这个对象的setBonus方法,肯定会有问题。
      

  2.   


    呵呵 经您提点,现在在看看又明白了,staff[0]被赋值后指向employee对象,
    而manager[0]也指向这个对象,调用manager[0].setBonus()时实际上是去employee
    类里去找setBonus()方法,employee类没有这个方法 所以出错,我理解的对吗?
      

  3.   

    我运行过了 的确是报一个ArrayStoreException的异常。谢谢mailnumber2 的指点。
      

  4.   

    比较有趣的是抛出异常的地方居然是:
    saff[0]=new Employee();而非你的方法调用之处。
    manager[0].setBonus()有趣呀有趣。谢谢。