2017-01-27 5 views
1

私は混乱しています。鋳造は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; 

私が知っていることから、サブクラスは親のインスタンスですが、それ以外の方法はありません。このコードで

+0

私は、実際のJavaコードにするためにあなたの質問を編集の自由を撮影した - これは正確にあなたの質問を反映していない場合は更新してください。 –

答えて

6

Integerその実数型である

Number n = new Integer(42); 

Numberは、n明らかタイプあります。 実数型に対してinstanceofチェックしながら

キャストは、明らかタイプを変更

結果として、鋳造はinstanceofの結果に影響しません。

1

language specを参照してください:

関係式の値がnullではなく、参照がなくてするReferenceTypeにキャストすることができれば、実行時に、instanceofオペレータの結果はtrueですClassCastExceptionを掲げる。それ以外の場合は結果はfalseです。

のでinstanceofはキャストによって影響されない:ランタイム値をキャストできるかどうかは確認しています。ランタイム値自体はキャストの影響を受けません。コンパイラに型変換が安全であることを「信頼する」ことを伝えるだけです。

ので、3ブール値は以下のとおりです。

  • b1
    • falseあなたがshape = nullを割り当てた場合、
    • trueあなたがshape = new Shape();、またはShapeの他のサブクラスを割り当てた場合は、shape = new Square();
    • falseを割り当てた場合。
  • b2
    • falseあなたがsquare = nullを割り当てた場合、
    • trueキャストは「新規」を作成しないため、Shapeです。
  • b3
    • falseあなたがshape = nullを割り当てた場合、
    • trueその他の場合、参照型のすべてのnullでないインスタンスは、Objectの変数に割り当てられたObject /にキャストできます。
関連する問題