A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Mr___dangerous 中级黑马   /  2015-11-4 23:12  /  729 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Test {
    public static void main(String[] args) {
        System.out.println(new Test() instanceof Exception);
    }
}

编译时居然报错,把Exception换成Object就可以编译通过了,打印false
有大神可以帮忙解释一下吗?

6 个回复

倒序浏览
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 ;
}
}

回复 使用道具 举报
学习了,以前还真不知道有这样的细节,谢谢!
instanceof左边是一个A类对象引用,右边是一个类名B
如果A和B没有继承关系的话,那么写出来这句话就是错的,天哪
回复 使用道具 举报
  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. }
复制代码
回复 使用道具 举报
因为定义的这个test类与Exception之间没有继承关系,所以报错了!而所有的类都有继承Object类,所以换为Object就不报错了!
回复 使用道具 举报
学习了又学到一招
回复 使用道具 举报
都答得很详细啊666666666666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马