Javaマスターへの道 資格勉強編 Part21
今日の問題はこちらです。
1 2 3 4 5 6 7 8 9 10 11 | 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もその一つです。他にも様々にありますので、興味のある方はぜひ調べてみてくださいね。
ではもし次のようにプログラムを変更したときそれぞれの変数はどうなるでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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なオブジェクトについてやりました。
次回をお楽しみに