铸造会影响instanceof操作的结果吗?

时间:2017-01-27 10:46:27

标签: java object instanceof

我很困惑。

假设我们有以下课程:

class Shape { /* ... */ }
class Square extends Shape { /* ... */ }

什么是最终的布尔值,为什么会这样呢?

Shape shape = ...;
boolean b1 = shape instanceof Square;

Square square = ...;
boolean b2 = ((Shape) square) instanceof Square;

boolean b3 = shape instanceof Object;

据我所知,子类是父类的实例,但不是相反?

2 个答案:

答案 0 :(得分:7)

在此代码中:

Number n = new Integer(42);

Numbern明显类型,而Integer真实类型

强制转换更改明显类型,而instanceof则检查真实类型

因此,施法对instanceof结果没有影响。

答案 1 :(得分:2)

请参阅language spec

  

在运行时,如果 RelationalExpression 的值不是instanceof并且引用可以转换为true,则null运算符的结果为ClassCastException ReferenceType 而不会引发instanceof。否则结果是错误的。

因此,b1不会受到强制转型的影响:它会检查是否可以投射运行时值;运行时值本身不受强制转换的影响,它所做的就是告诉编译器“信任你”#34;类型转换是安全的。

所以,三个布尔是:

  • false
    • shape = null如果您分配了true;
    • 如果您指定了shape = new Square(); ,则
    • false
    • shape = new Shape();如果您指定了Shape,或b2的任何其他子类。
  • false
    • square = null如果您分配了true;
    • Shape否则,因为演员没有创建一个新的" b3
  • false
    • shape = null如果您分配了true;
    • Object否则,因为引用类型的每个非null实例都可以转换为Object /分配给O(n)类型的变量。