public class Test{
public static void main(String[] args){
Animal a = new Animal();
Cat cat = new Cat();
System.out.print(a.isInstanceOfAnimal(a));
}
}
class Animal{
public boolean isInstanceOfAnimal(Object obj){
return (obj instanceof Animal) && !(obj instanceof Dog) && ! (obj instanceof Cat);
}
}
class Dog extends Animal{}
class Cat extends Animal{}
如果obj instanceof Animal为true,那么obj有可能引用Animal 类本身、Dog类本身或Cat类本身的实力,如果obj instanceof Dog和obj instanceof Cat均为false那么obj不会引用Dog本身或者Cat类本身的实例。就可以得到obj引用Animal类本身的实例的结论,可问题是,&&这个短路与的计算规则是如果能根据操作符左边的布尔表达式就能计算出整个表达式的值将不再执行操作符号右边的布尔表达式,对于非短路操作符始终会执行两边的表达式。
当obj instanceof Animal这个可以判断出表达式是False还是True,那后边的就不会被计算,可是运行时还是被计算了,不明白,请大家指点一下

解决方案 »

  1.   

    楼主逻辑没学好。&&操作符只有当左边为false时才造成短路,如果为true,仍然要计算右边表达式,如果仅凭左边一个表达式就能得出结果,那还要右边干吗?||操作符的断路情况恰恰相反,仅在左边为true时造成短路。
      

  2.   

    我觉得要想实现(obj instanceof Animal为true,那么obj有可能引用Animal 类本身、Dog类本身或Cat类本身的实力,如果obj instanceof Dog和obj instanceof Cat均为false那么obj不会引用Dog本身或者Cat类本身的实例。就可以得到obj引用Animal类本身的实例的结论)应该写成
    return (obj instanceof Animal) & !(obj instanceof Dog) & ! (obj instanceof Cat);
    但是用&&和&,运行结果没有区别?这是怎么回事?
      

  3.   

    我觉得要想实现(obj instanceof Animal为true,那么obj有可能引用Animal 类本身、Dog类本身或Cat类本身的实力,如果obj instanceof Dog和obj instanceof Cat均为false那么obj不会引用Dog本身或者Cat类本身的实例。就可以得到obj引用Animal类本身的实例的结论)应该写成
    return (obj instanceof Animal) & !(obj instanceof Dog) & ! (obj instanceof Cat);
    但是用&&和&,运行结果没有区别?这是怎么回事?
      

  4.   

    谢谢啊,老师没讲这个短路与,看孙卫琴的那本JAVA面向对象编程发现这个问题,可是您说的这个知识点孙卫勤书上也没写。谢谢你的赐教,我觉得要想实现(obj instanceof Animal为true,那么obj有可能引用Animal 类本身、Dog类本身或Cat类本身的实力,如果obj instanceof Dog和obj instanceof Cat均为false那么obj不会引用Dog本身或者Cat类本身的实例。就可以得到obj引用Animal类本身的实例的结论)应该写成
    return (obj instanceof Animal) & !(obj instanceof Dog) & ! (obj instanceof Cat);
    但是用&&和&,运行结果没有区别?这是怎么回事?