和大多数面向对象语言样Java允许使用对象的父类类型个变量指示该对象对于前面定义Employee和Manager类下面语句是合法:
Employee e= Manager;
使用变量e可以只访问Employee对象内容而隐藏Manager对象中特殊内容.这是编译器知道e是个Employee而不是Manager对象引用赋值兼容原则允许把子类例子赋给父类引用但反过来是不能把父类例子赋给子类引用如下行将导致个:
Manager m= Employee;
如果用instaneeof运算符已判明父类引用指向是子类例子就可以转换该引用恢复对象全部功能
例5—13
public void method(Employee e){
(e instanceof Manager){
Manager m=(Manager)e:
.OUt.prln(”This is the manager of”+m.department):
}
∥其他操作
}
如果没进行转换当引用e.department时编译器知道在Employee中没有department成员所以会出现
如果没用instanceof测试过可能就会出错般地要替换对象引用时需做下列检查:
(1)沿类层次向“上”转换总是合法例如把Manager引用转换为Employee引用实际上此种方式下不需要转换运算符只用简单赋值语句就可完成
(2)对于向“下”替换只能是父类到子类转换其他类的间是不允许例如把Manager引用转换为Contractor引用肯定是非法Contractor不是Manager这两个类的间没有继承关系要替换类(赋值号右侧)必须是当前引用类型(赋值号左侧)某个子类
(3)编译器检查正确后需在运算时检查引用类型如果源中忘记进行instanceof检查要替换对象不是目标类型对象则引发个异常异常是运行时种
最新评论