を再割り当てするには、次のコードを考えてみましょう。私は次のコードでコンパイルエラーを取得する理由しかし、私は理解していない:私の視点から明示的なキャストと
class A{}
class B extends A{
public static void main(String args[]){
A exampleA = new A();
B exampleB = new B();
exampleA = exampleB;
exampleB = exampleA; // compile error
をexampleBがするように、ポインタexampleAは現在、クラスBのオブジェクトである、同じオブジェクトを指しますさらに、ポインタexampleAを再割り当てするため、私は最後のコード行をexampleB = exampleBと等しく解釈します。コンパイラの意見は一致せず、コンパイラとは思えません。誰かが私にエラーが出る理由を教えてもらえますか?
私は両方のクラスに対してもgetClassメソッドを使用しました。出力は両方とも実際に同じオブジェクトを指していることを示しています。したがって、私は混乱しています。
私はプログラミングが初めてで、コンパイラの考え方について詳しく知りたいと思っています。質問に答えるだけでなく、コンパイラとランタイムロジックを区別するための書籍やその他の情報源に関するヒントは非常に役に立ちます!
私は2番目のコードブロックを解決する方法を知っていることに注意してください。これは明示的なキャストを行うだけです。
は、実行時に' ClassCastException'を取得したいですs。 –
Javaコンパイラはコード内の値をトラッキングしません。キャストせずに 'B'に' A'を代入することはできません。実行時に 'B'でなければ失敗する可能性があります。 –
はい私はそれについて忘れていました、私は実行時にClassCastExceptionを取得します。なぜなら、初期化の間、それらはお互いに関連していないからです。 まだ、コンパイルエラーが発生する理由は私の質問には答えられません。なぜコンパイラはそれを見ないのですか? @AndyTurner:2番目のコメントは私の質問に部分的に答えました。ありがとうございました。あなたは顔の時間と呼ぶものから論理的な追跡を分離する方法を習得するにはどうすればよいですか?それを手伝ってくれる本はありますか? – AJavaStudent