public class Sample {
private String value; // フィールド変数はデフォルトでnullに初期化されます。
public void setValue(String value) {
// ここで問題が起こります。'this'キーワードがないため、
// フィールドの'value'ではなく、引数のローカル変数'value'が参照されています。
// 結果として、フィールドの'value'は変更されずにnullのままです。
value = "Hello, " + value; // 正しくは 'this.value = "Hello, " + value;' であるべきです。
}
public String toString() {
// 'value' フィールドの値を返しますが、setValueメソッドではフィールドが更新されていないため、
// このメソッドが返すのはデフォルト値の 'null' です。
return value; // 'null' が返されることになります。
}
}
public class Main {
public static void main(String[] args) {
Sample s = new Sample(); // Sampleクラスのインスタンスを生成します。
s.setValue("Java"); // ここでは実際には何も設定されていません。フィールド'value'はnullのままです。
System.out.println(s.toString()); // 'null' を出力します。
}
}
このコードを実行すると、setValue
メソッド内でthis
キーワードが使われていないため、Sample
クラスのvalue
フィールドは変更されずにnull
を保持し続けます。したがって、toString
メソッドはこのnull
値を文字列として返すので、出力はnull
となります。
追記
このJavaコードにおいて、Sample
クラスのsetValue
メソッド内でvalue
をthis.value
に置き換えた場合の出力を考えます。
以下は変更されたSample
クラスのコードです。
public class Sample {
private String value;
public void setValue(String value) {
this.value = "Hello, " + value;
}
public String toString() {
return value;
}
}
この変更を加えた状態でMain
クラスを実行した場合の出力は次の通りです。
public class Main {
public static void main(String[] args) {
Sample s = new Sample();
s.setValue("Java");
System.out.println(s.toString());
}
}
Main
クラスのmain
メソッド内でsetValue
メソッドが呼び出されると、this.value
は"Hello, Java"に設定されます。そして、toString
メソッドはthis.value
を返すので、最終的な出力は以下のようになります。
Hello, Java
ですので、出力は"Hello, Java"
となります。
補足
わかりやすく説明します。
まず、コード全体をもう一度確認しましょう。
public class Sample {
private String value;
public void setValue(String value) {
this.value = "Hello, " + value;
}
public String toString() {
return value;
}
}
public class Main {
public static void main(String[] args) {
Sample s = new Sample();
s.setValue("Java");
System.out.println(s.toString());
}
}
- オブジェクトの作成
Sample s = new Sample();
ここで、Sample
クラスのインスタンスs
が作成されます。この時点では、value
はまだ初期化されていません。
- メソッド呼び出し
s.setValue("Java");
ここで、s
のsetValue
メソッドが呼び出され、引数として"Java"
が渡されます。このときの流れを詳しく見てみましょう。
-
setValue
メソッドの引数value
に"Java"
が渡されます。
- メソッド内部の処理
public void setValue(String value) {
this.value = "Hello, " + value;
}
- 引数として渡された
value
は"Java"
です。 - メソッド内で
this.value = "Hello, " + value;
が実行されます。ここでthis.value
はSample
クラスのインスタンス変数value
を指し、"Hello, " + value
は"Hello, Java"
となります。 - 結果として、
this.value
には"Hello, Java"
が代入されます。
- 結果の表示
System.out.println(s.toString());
- 最後に
toString
メソッドが呼び出され、this.value
が返されます。この場合、this.value
には"Hello, Java"
が代入されているので、"Hello, Java"
が出力されます。
この流れを図にすると以下のようになります。
-
s.setValue("Java")
が呼び出される。 -
setValue
メソッドの引数value
に"Java"
が渡される。 -
this.value
に"Hello, Java"
が代入される。
この一連の流れにより、value
には"Hello, Java"
が設定されます。
Top comments (0)