【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
プレビュー