假如有这样的一个数组 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里的方法,
staff[0]=new Employee(...);
staff[1]=new Employee(...);
staff[2]=new Manager(...);其中Manager是Employee的子类。我想知道的是staff[2]是已经被强制转换成Employee类了吗?
是不是staff[2]属于Employee类,我调试了一下staff[2]不能使用Manager里的方法,
不过如果Employee有虚函数而Manager里重载了,就可以调用Manager的重载函数
用staff[2]=new Manager(...); 前面的staff[2]只是引用,并且只是manager对象的部分引用。你要使用全部引用的话可以
Manager managerTemp = (Manager)staff[2]; 进行强制转换成对象的本身类型。
这是java里的上传型, 就是你实例了一个对象,可以只部分引用。也就是用接口名父类定义,子类型实例化
Staff[2]只是引用,类似c里的指针。
通俗点说:
Magager m = new Manager(...); m可以看成一个指针集,指针指向new Manager(...); 所得对象的所有方法和属性
staff[2]=new Manager(...);staff[2]也是一个指针集,但只指向new Manager(...); 所得对象的部分属性和方法,也就是父类所定义的属性和方法。如果是上转型对象那么就不可以调用子类中新增的方法?
那是当然,要调用的话必须强制转换成子类类型。
Manager类本身就是Employee的子类,不用强制,由于数组元素类型时Employee类型,所以你不能直接调用
Manager类里面的方法,因,如果子类重载或者重写了父为它只能看到Employee里面的方法类中的方法,那么调用的时候,是调用子类Manager中的方法,Manager manger = (Manager)employee; 强制转换之后,就可以调用manager里面的方法啦。