大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

Javaマスターへの道 資格勉強編 Part21

株式会社クローバーフィールドの経営理念
著者:miyauchiatsushi
公開日:2023/08/07
最終更新日:2023/08/07
カテゴリー:技術情報
タグ:

今日の問題はこちらです。

public class Main {
	public static void main(String[] args) {

		String str = "wake up";
		joke(str);
		System.out.println(str);
	}
	public static void joke(String msg) {
		msg.replaceAll("wake", "stand");
	}
}

さてこのプログラムを実行するとstrはどのように出力されるでしょう。

1, “wake up”

2, “stand up”

3, コンパイルエラー

答えはどれでしょうか、それでは答え合わせです

答えは1です。この問題ではStringクラスなどのimmutableオブジェクトについての説明をします。
今回の場合メソッドに渡されているのはstrのコピーのオブジェクトなので、
もともとのstrが変わることはありません。
immutableなオブジェクトは中身がメソッドなどで意図せず変更されるのを防ぐ機能があり、
Stringもその一つです。他にも様々にありますので、興味のある方はぜひ調べてみてくださいね。

ではもし次のようにプログラムを変更したときそれぞれの変数はどうなるでしょう。

public class Main {
	public static void main(String[] args) {

		String str = "wake up";
		joke(str);
		System.out.println(str);
	}
	public static void joke(String msg) {
		var s = msg.replaceAll("wake", "stand");
		System.out.println(s);
		System.out.println(msg);
	}
}

答えは以下のようになります。

s = “stand up”
msg = “wake up”
str = “wake up”

これはさっきの解説をわかりやすく試してみたものですが、とてもわかりやすく理解できると思います。
最初に出力されたsはjokeメソッド内で定義しているので、ちゃんと文字が置換されて出力されます。
一方で引数で渡されたmsgはもとのまま出力されていますので、
これは置換がされなかったということになります。
sは新たに定義されたインスタンスなのでもとが空ですが、
msgは元々の値があるので変更できないということになります。そしてstrは予想がつきますよね。

今回はimmutableなオブジェクトについてやりました。
次回をお楽しみに

    次の記事 :
    上に戻る