黑马程序员技术交流社区

标题: 关于instanceof的疑问 [打印本页]

作者: Mr___dangerous    时间: 2015-11-4 23:12
标题: 关于instanceof的疑问
public class Test {
    public static void main(String[] args) {
        System.out.println(new Test() instanceof Exception);
    }
}

编译时居然报错,把Exception换成Object就可以编译通过了,打印false
有大神可以帮忙解释一下吗?
作者: dengwenjing58    时间: 2015-11-5 09:47
instanceof它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来判断继承中的子类的实例是否为父类的实现。

举个例子:
String s = "I AM an Object!";
boolean isobject = s instanceof Object;
我们声明了一个String对象引用,指向一个String对象,然后用instanceof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isobject的值为true。
instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:
public class Bill {//省略细节}
public class PhoneBill extends Bill {//省略细节}
public class GasBill extends Bill {//省略细节}
在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:
public double calculate(Bill bill) {
if (bill instanceof PhoneBill) {
//计算电话账单
}
if (bill instanceof GasBill) {
//计算燃气账单...
}

所以使用instanceof的时候,左右两边的必须是某个类(Object比较特殊,要另外考虑)的共同实现,或者实现类的子类否则是会报错

nstanceof 一般情况下 用在对象类型的强制转换,
例如:
继承关系 class Manager extends Employee
----------------------------------------------------------
public void doSomething(Employee e) {
if ( e instanceof Manager){
Manager m = (Manager) e ;
}
}


作者: li3N    时间: 2015-11-5 14:06
学习了,以前还真不知道有这样的细节,谢谢!
instanceof左边是一个A类对象引用,右边是一个类名B
如果A和B没有继承关系的话,那么写出来这句话就是错的,天哪
作者: li3N    时间: 2015-11-5 14:17
  1. public class Test {
  2.     public static void main(String[] args) {
  3.             Throwable t = new Throwable();
  4.             Exception e = new Exception();
  5.             Error er = new Error();
  6.             System.out.println(e instanceof Exception); //左右两边相同,true
  7.             System.out.println(e instanceof Throwable); //左边是右边的子类,true
  8.             System.out.println(t instanceof Exception); //左边是右边的父类,false
  9.             //System.out.println(e instanceof Error); //左边是右边的兄弟类,这也报错
  10.             //System.out.println(e instanceof ArrayList); //左边和右边什么关系也没有,报错
  11.     }
  12. }
复制代码

作者: 木子子木    时间: 2015-11-5 15:23
因为定义的这个test类与Exception之间没有继承关系,所以报错了!而所有的类都有继承Object类,所以换为Object就不报错了!
作者: 3872982    时间: 2015-11-5 15:29
学习了又学到一招
作者: 小笨笨天    时间: 2015-11-5 16:45
都答得很详细啊666666666666




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2