【Java】アップキャストとダウンキャストにおける値の生存について
以下のMain
プログラムを実行した際に、実行結果としてtrue
が表示される理由がわかりません。
私が思うには、Sample
クラスの13行目のs.num
でコンパイルエラーが起ると思うのですが、なぜかコンパイルも実行も通ります。
Sample.java
java
1public class Sample { 2 private int num; 3 public Sample(int num) { 4 this.num = num; 5 } 6 @Override 7 public boolean equals(Object obj) { 8 if (obj == null) { 9 return false; 10 } 11 if (obj instanceof Sample) { 12 Sample s = (Sample) obj; 13 return s.num == this.num; 14 } 15 return false; 16 } 17}
Main.java
java
1public class Main { 2 public static void main(String[] args) { 3 Sample a = new Sample(10); 4 Sample b = new Sample(10); 5 System.out.println(a.equals(b)); // true 6 } 7}
※ 二つのクラスは同パッケージにあります
解釈
Sampleクラスの7行目、equals
メソッドの引数はObject
クラスとなっている。
呼び出し元のMain
クラスの5行目では、引数がSample
クラスになっている。
この場合、暗黙的にSample
クラスで引数を取得、宣言したときに、
java
1Object obj = (Object) b;
が実行されていると思う。
この時に、Object
クラスにはint
型のnum
というフィールドは存在しないはずなので、引数として渡されると同時にnum
は消失することになると思う。
それにもかかわらず、
12行目で再度Sample
クラスへとダウンキャストした際にnum
の値が保持されているのはなぜなのか?
ここまでの私の解釈で間違っているところを教えて頂きたいです。
質問内容
- 12行目で再度
Sample
クラスへとダウンキャストした際にnum
の値が保持されているのはなぜか? - 私の解釈の中で間違っているところをご指摘頂きたい
以上、よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー