今日も頑張って問題を解きましょう。
問題
次のコードを実行したときの出力を選んでください。どれが正しいでしょうか?
class Car {
String model;
Car(String model) {
this.model = model;
}
}
public class Test {
public static void main(String[] args) {
Car myCar = new Car("Sedan");
myCar = new Car("Convertible");
System.out.println(myCar.model);
}
}
選択肢
- A. Sedan
- B. Convertible
- C. null
- D. コンパイルエラー
答えと解説
回答を見る
答え
B. Convertible
解説
基本説明:
このコードでは、Car
クラスのインスタンスを作成し、そのmodel
というフィールドにモデル名を保持しています。
最初に”Sedan”というモデル名を持つCar
オブジェクトを作成し、その後で別の”Convertible”というモデル名を持つオブジェクトをmyCar
に再割り当てします。
このため、myCar.model
は”Convertible”になります。
誤答理由:
- A. “Sedan”は最初のオブジェクトのモデル名ですが、
myCar
が再割り当てされるので、最終的にこの値ではありません。 - C. nullになる状況はありません。どちらかというと、オブジェクトが正しくインスタンス化されているため、nullにはなりません。
- D. コンパイルエラーが発生する要素はありません。コードは正しく構文を満たしています。
つまずきポイント:
この問題で引っかかりやすいポイントは、オブジェクトの再割り当てと、それによる参照の切り替えです。
新しいオブジェクトを割り当てることで、古いオブジェクトの参照は失われ、その結果、最初に作成した”Sedan”のモデルを持つオブジェクトは使用できなくなります。このオブジェクトはガベージコレクションの対象になります。
発展知識:
Javaはガベージコレクション機能を持っており、使用されなくなったオブジェクトはメモリから自動的に回収されます。今回のケースでは、最初のCar
オブジェクトはmyCar
の参照が変更されることで回収対象となります。
プログラマとしてこのガベージコレクターの動作を理解することは、メモリ管理を意識する上で重要です。このような再割り当ての際には、メモリ効率を考慮して必要のないオブジェクトの生成や参照の誤用を避けることが求められます。