本来是一个很初级的问题,我却得到了不同的答案,于是我也晕了!
Employee是Manager的父类;有一个方法是这样定义的:
public void someMethod(Employee e){
if (e instanceof Manager){
Manager m = (Manager) e ;
m.getDepartment();
}
}
我想问的是既然已经判断了e是Manager类型的对象了,那为什么还要使用Cast进行强制转换?第一种答案:
    编译器不会去判断你的逻辑,如果不强制转换,则编译无法通过;
第二种答案:
    instanceof运算符只是判断你的对象是不是Manager类型的,并没有做任何类型转换的事情.
如果说你的getDepartment()方法是再Manager中定义的,那么你将Manager类的对象当作Employee
传入someMethod(Employee e)的时候getDepartment()方法的信息已经丢失了.
所以你用Employee类型的引用e是调不到getDepartment()的,即使你的对象本身是Manager类型的.
只能通过Manager类型的引用去调用getDepartment().
显然不能直接将e赋给m,因为他们属于不同的类型,所以这里需要强制Downcasting.
当然如果e引用的根本就不是Manager的这里就会?出ClassCastException了,为了避免这样的情况发生,就先用instanceof运算符判断一下e是不是Manager类型以保证类型转换的正确性和安全性.
究竟那个对,还是两个都对,只是站在不同的角度上看这个问题?

解决方案 »

  1.   

    顶一下!====CSDN 小助手 V2.5 2005年11月05日发布====
    CSDN小助手是一款脱离浏览器也可以访问Csdn论坛的软件
    界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/11/05/523395.aspx
    下载:http://szlawbook.com/csdnv2
      

  2.   

    支持了
    虽然看不懂
    呵呵,我初学JAVA
      

  3.   

    把你的第一条和第2条结合起来看“
    那么你将Manager类的对象当作Employee
    传入someMethod(Employee e)的时候getDepartment()方法的信息已经丢失了.
    ”这不对,方法信息没有丢失,只是 employee调用不到,编译器不知道他有这方法,
    你的e只是一个一个引用,指向Manager的对象
      

  4.   

    instanceof 只是表明当前对象是否为某一个类的对象或其子类的对象!Employee e = new Employee();
    Manager m = new Manager();e instanceof Employee  返回true
    m instanceof Manager   返回true!!!所以如果只想判断仅为某一个类的对象,千万别用instanceof,应该使用如下方法判断!!!e.getClass().equals(Employee.class)  返回true
    m.getClass().equals(Manager.class)   返回false!!!
      

  5.   

    晕,写错了e instanceof Employee  返回true
    m instanceof Employee  返回true!!!e.getClass().equals(Employee.class)  返回true
    m.getClass().equals(Employee.class)   返回false!!!