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,那后边的就不会被计算,可是运行时还是被计算了,不明白,请大家指点一下
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,那后边的就不会被计算,可是运行时还是被计算了,不明白,请大家指点一下
return (obj instanceof Animal) & !(obj instanceof Dog) & ! (obj instanceof Cat);
但是用&&和&,运行结果没有区别?这是怎么回事?
return (obj instanceof Animal) & !(obj instanceof Dog) & ! (obj instanceof Cat);
但是用&&和&,运行结果没有区别?这是怎么回事?
return (obj instanceof Animal) & !(obj instanceof Dog) & ! (obj instanceof Cat);
但是用&&和&,运行结果没有区别?这是怎么回事?