本来是一个很初级的问题,我却得到了不同的答案,于是我也晕了!
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类型以保证类型转换的正确性和安全性.
究竟那个对,还是两个都对,只是站在不同的角度上看这个问题?
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类型以保证类型转换的正确性和安全性.
究竟那个对,还是两个都对,只是站在不同的角度上看这个问题?
解决方案 »
- Java哪些书籍比较经典啊,大家推荐下,谢谢
- 一个Java GUI的程序 无法 运行。哪位大哥帮忙解决
- 添加一组数组按钮程序编译 帮我修改下 谢谢
- java如何调用jsp页面
- 问个简单的问题吧 关于javascript的<input type="submit" name="Submit" onclick="queryButtonClick()" value="提交"> 我怎样写queryB
- 怪事,谁见过啊
- 300分求确切答案:子类到底继承什么?
- 关于java的IO流出现一点奇怪的事情,求高人解答一下?
- 关于java连接SqlServer的问题!
- 如何判断一个远程文件是否存在?
- 如何将从JTextField中得到的字符串写到数据库中的日期型列里
- jdbc连sqlserver2000时快时慢,怎么回事???
CSDN小助手是一款脱离浏览器也可以访问Csdn论坛的软件
界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/11/05/523395.aspx
下载:http://szlawbook.com/csdnv2
虽然看不懂
呵呵,我初学JAVA
那么你将Manager类的对象当作Employee
传入someMethod(Employee e)的时候getDepartment()方法的信息已经丢失了.
”这不对,方法信息没有丢失,只是 employee调用不到,编译器不知道他有这方法,
你的e只是一个一个引用,指向Manager的对象
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!!!
m instanceof Employee 返回true!!!e.getClass().equals(Employee.class) 返回true
m.getClass().equals(Employee.class) 返回false!!!