0
0
この場合はStringオブジェクトはイミュータブルなためrrrメソッドとメインメソッドでは違うオブジェクトを参照しているということでよいでしょうか?
オブジェクトが二つできて同じ変数で二つ参照しているということでしょうか?
java
public class a {
public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String a="a"; rrr(a); System.out.println(a); } public static void rrr(String s) { s="sss"; System.out.println(s); }
}
出力
sss
a
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答15件
#1
総合スコア13168
投稿2023/08/10 15:18
ご提示のコードで結果が
sss sss
とならない理由なら
Stringオブジェクトはイミュータブルなため
とは関係ないと思います。
#2
総合スコア1
投稿2023/08/10 15:41
どのような理由なのでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#3
総合スコア85766
投稿2023/08/10 16:18
編集2023/08/10 16:24このケースでは、文字列がイミュータブルかどうかは関係ありません。
メソッドrrr
の仮引数のs
に代入した段階で、実引数であったa
の中味の文字列"a"
と、変数s
の関係は無くなります。
a = "a"; s = a; s = "sss"; System.out.println(a);
・変数への代入(変数に入っているオブジェクトを、別のオブジェクトに入れ替える)
・ミュータブルなオブジェクトの加工(変数に入っているオブジェクトをそのオブジェクトのまま入れ替えず、中味を変更する)
の2つの区別が付かないと言うことかと思いますが、別の概念です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#4
総合スコア1
投稿2023/08/11 02:30
参照番地のコピーをわたしているためミュータブル、イミュータブルが関係すると思うのですがどうでしょうか打ち消し線
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#6
総合スコア13168
投稿2023/08/11 03:39
編集2023/08/11 11:55#4
String オブジェクトがイミュータブルなことと、 String 型変数がイミュータブル(?) なことは違います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#7
総合スコア1
投稿2023/08/11 05:06
これがもしミュータブルオブジェクトのStringBuilderだと参照番地のコピーをして書き換えると呼び出し元も変わってしまうが、イミュータブルのStringだと”a”オブジェクトを書き換えることができないため、”sss”のオブジェクトを新しく生成してそこを参照するという考え方ではないのでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#8
総合スコア85766
投稿2023/08/11 05:14
これがもしミュータブルオブジェクトのStringBuilderだと参照番地のコピーをして書き換えると呼び出し元も変わってしまうが、イミュータブルのStringだと”a”オブジェクトを書き換えることができないため、”sss”のオブジェクトを新しく生成してそこを参照するという考え方ではないのでしょうか?
はい。そういう考え方は間違っています。
先の回答に書いた、
a = "a"; s = a; s = "sss"; System.out.println(a);
と同じ事が起こっています。これがミュータブルでも同じです。
a = なんらかのミュータブルなオブジェクトその1; s = a; s = 上とは異なる何らかのミュータブルなオブジェクトその2; System.out.println(a);
だと、その1が表示されます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#9
総合スコア1
投稿2023/08/11 05:54
他の意見どなたかあるでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#10
総合スコア9807
投稿2023/08/11 07:03
編集2023/08/11 07:24この辺の動作を理解できていないってことですよね?
もう参照渡しとは言わせない - Qiita
まあ間違えている人もいっぱいいるわけですが、「その動作がない言語」で理解するのはなかなか難しい話だとは思います。
"call by reference"ではない動作を「参照渡し」と言っている記事まとめ - Qiita
「その動作がある言語」を、ちょっとでも触ってみるといいかもしれません^^
C#
cs
1public class a 2{ 3 public static void Main(string[] args) 4 { 5 string a = "a"; 6 rrr(ref a); 7 System.Console.WriteLine(a); 8 } 9 10 public static void rrr(ref string s) 11 { 12 s = "sss"; 13 System.Console.WriteLine(s); 14 } 15}
出力
sss sss
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#11
総合スコア360
投稿2023/08/11 07:24
ご提示のコードをミュータブルと言われるStringBuilder
で書くとこうでしょうか。
java
1public static void main(String[] args) throws Exception { 2 var a = new StringBuilder("a"); 3 rrr(a); 4 System.out.println(a); 5} 6 7public static void rrr(StringBuilder s) { 8 s= new StringBuilder("sss"); 9 System.out.println(s); 10}
これも出力は
sss
a
になるかと思います。
この8行目が#3 otnさんの言われていることです。
メソッドrrrの仮引数のsに代入した段階で、実引数であったaの中味の文字列"a"と、変数sの関係は無くなります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#12
総合スコア1
投稿2023/08/11 11:36
編集2023/08/11 12:11返信ありがとうございます。
何度も質問申し訳ございません
String sに参照番地のコピーが入れられていたがs="sss";とすることで新しい参照の番地がsに格納されたという認識でしょうか
返信よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#14
総合スコア1
投稿2023/08/11 12:24
ありがとうございます。解決しました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#15
総合スコア7
投稿2023/08/17 00:03
結局何がわからなかったのかわからん
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。