假如有这样的一个数组 Employee[]staff=new Employee[] 
staff[0]=new Employee(...);
staff[1]=new Employee(...);
staff[2]=new Manager(...);其中Manager是Employee的子类。我想知道的是staff[2]是已经被强制转换成Employee类了吗?
是不是staff[2]属于Employee类,我调试了一下staff[2]不能使用Manager里的方法,

解决方案 »

  1.   

    staff[2]已经是Employee了
    不过如果Employee有虚函数而Manager里重载了,就可以调用Manager的重载函数
      

  2.   

    Manager m = (Manager)staff[2]; //强行转换为m后使用m就可以了
      

  3.   

    new Manager(...);是新建了一个Manager对象,
    用staff[2]=new Manager(...); 前面的staff[2]只是引用,并且只是manager对象的部分引用。你要使用全部引用的话可以
    Manager managerTemp = (Manager)staff[2]; 进行强制转换成对象的本身类型。
    这是java里的上传型, 就是你实例了一个对象,可以只部分引用。也就是用接口名父类定义,子类型实例化
      

  4.   

    谢谢各位大虾 但是我还是有点不明白,staff[2]=new Manager(...);这样Staff[2]是不是Manager的上转型对象了?如果是上转型对象那么就不可以调用子类中新增的方法?是这么理解吗
      

  5.   


    Staff[2]只是引用,类似c里的指针。
    通俗点说:
    Magager m = new Manager(...); m可以看成一个指针集,指针指向new Manager(...); 所得对象的所有方法和属性
    staff[2]=new Manager(...);staff[2]也是一个指针集,但只指向new Manager(...); 所得对象的部分属性和方法,也就是父类所定义的属性和方法。如果是上转型对象那么就不可以调用子类中新增的方法?
    那是当然,要调用的话必须强制转换成子类类型。
      

  6.   

    我想知道的是staff[2]是已经被强制转换成Employee类了吗?
    Manager类本身就是Employee的子类,不用强制,由于数组元素类型时Employee类型,所以你不能直接调用
    Manager类里面的方法,因,如果子类重载或者重写了父为它只能看到Employee里面的方法类中的方法,那么调用的时候,是调用子类Manager中的方法,Manager manger = (Manager)employee; 强制转换之后,就可以调用manager里面的方法啦。
      

  7.   

    通俗说staff[2]只是指针,要说强制转换的话也是转成Manager类型的指针罢了。
      

  8.   

    这个应该不是强制转换啊。具体说应该是上转型。Manager继承或实现Employee类,然后用Manager去实现父类或父接口都是上转型的把