###前提・実現したいこと
String(参照型)について理解したい。
###質問
以下のコードをコンパイル・実行すると
【UPDATED, ORIGINAL】となるのですが、
私としては両方UPDATEになるべきだと思っています。理由は以下です。
①s1とs2は同じ場所を参照している
②s1="UPDATE"でs1にある値を変更したから。
私の認識のどこが間違っているんでしょうか。
ご教示お願いします。
###ソースコード
public class Main { public static void main(String[] args) { String s1 = "ORIGINAL"; String s2 = s1; //① s1 = "UPDATED"; //② System.out.print(s1); System.out.print(", "); System.out.print(s2); } }
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
String s1 = "ORIGINAL";
では、"ORIGINAL"
の参照値をs1
に代入しています。
①では、s1
に代入された参照値をs2
にコピーして代入しています。
②では、"UPDATE"
の参照値をs1
に代入しています。
このとき、s2
に入っている参照値は"ORIGINAL"
の参照値のままです。
(追記)
下記のページにある画像を例にすると、赤い点が参照値の部分です。オブジェクトは文字列などが該当します。
http://homepage3.nifty.com/teranet/JavaPrograming/javaClass7.html
投稿2016/02/17 08:45
編集2016/02/17 08:51総合スコア9390
0
イメージされているのは、以下のようなことですよね?
java
1public static void main(String[] args) throws Exception { 2 List<String> list1 = new ArrayList<>(); 3 list1.add("aaa"); 4 5 List<String> list2 = list1; 6 list1.set(0, "bbb"); 7 8 System.out.println(list2.get(0)); // bbb と表示 9}
Stringはかなりの特別扱いで特殊なんですよ。
分かりづらいですよね。。。
投稿2016/02/17 09:17
総合スコア4666
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/17 16:50
2016/02/25 04:01
2017/02/17 04:07
2017/02/17 06:04
2017/02/17 06:19
2017/02/17 14:17
0
String については他の方の回答の通りです。
ここで、次のコードと、実行結果をみてください。
String をメンバーのもつクラスを定義し、そのインスタンスについて、同様のことを行ってみています。
java
1public class MyClass { 2 public static void main(String[] args) { 3 String s1 = "ORIGINAL"; 4 String s2 = s1; // ① 5 s1 = "UPDATED"; // ② 6 System.out.print(s1); 7 System.out.print(", "); 8 System.out.print(s2); 9 System.out.print("\n"); 10 11 StrHolder sh1 = new StrHolder(); 12 StrHolder sh2 = sh1; 13 sh1.setStr("UPDATED_X"); 14 System.out.print(sh1.getStr()); 15 System.out.print(", "); 16 System.out.print(sh2.getStr()); 17 18 System.out.print("\n"); 19 System.out.println(s1 == s2); 20 System.out.println(sh1 == sh2); 21 } 22} 23class StrHolder { 24 private String str = "ORIGINAL_X"; 25 26 public void setStr(String s) { 27 this.str = s; 28 } 29 public String getStr() { 30 return this.str; 31 } 32}
実行結果
UPDATED, ORIGINAL UPDATED_X, UPDATED_X false true
このような結果になることが理解できますか?
投稿2016/02/17 13:02
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/17 09:18
2016/02/17 09:22
2016/02/17 09:26
2016/02/25 04:01