Stringが値伝達か参照伝達か
11251 ワード
本文は慕課網の文章から来た.https://www.imooc.com/article/288336
今日は面白い問題を見つけました.Stringタイプのパラメータをメソッドに入力し、メソッド内で参照の値を変更します.そしてメソッド外でこの値を使用すると,このStringは以前の値であり,変化していないことが分かった.
ここで皆さんに紹介します.javaは伝参時に値していることを知っています. トランスファ および リファレンス転送 .パラメータがベースタイプの場合は値転送、パラメータがパッケージタイプの場合は参照転送です.例:
基本タイプパラメータ
パッケージタイプパラメータ
上記の2つの例は、明らかな値伝達および参照伝達である.しかしパラメータがStringタイプなら?具体的な例を見てみましょう
これはjavaの最下位のメカニズムから言えば、javaのメモリモデルは スタック および スタック .
問題の真髄.まず、この言葉に基づいて基本的なタイプの伝達を説明します.仮想マシンはnumのメモリアドレスに割り当てられ、値0. が格納される.仮想マシンはnumをコピーしました.numと呼ばれています.numとnumのメモリアドレスは違いますが、保存されている値は0です. 仮想マシンはnum’の伝達方法を話し、方法はnum’の値を1. に変更する.メソッドが終了すると、メソッド外でnumの値が印刷され、numメモリの値が変化するか0かのため、印刷は0. である.
パッケージタイプの伝達について説明します.仮想マシンは、proNameとnumを含むProductのメモリ領域をスタックに開きます. 仮想マシンはスタックにpのメモリアドレスを割り当て、このアドレスには1のProductのメモリアドレスが格納されている. 仮想マシンはpをコピーしました.私たちは彼をp’と呼んでいます.pとp’のメモリアドレスは違いますが、それらのメモリの値は同じで、1のProductのメモリアドレスです. p'をメソッドに転送し、メソッドは1のproNameとnumを変更します. メソッドが終了すると、メソッド外印刷pにおける変数の値は、pとp’に格納されているのはいずれも1中Productのアドレスであるが、1中Productにおける値が変更されるので、メソッド外印刷pの値は、メソッド実行後である.パッケージタイプの値が変化する効果を示した. 最後に、Stringの伝達過程における手順を説明します.仮想マシンは、スタックにメモリを開き、値「ab」を併存します. 仮想マシンはスタックにstrのメモリに割り当てられ、メモリには1のアドレスが格納されています. 仮想マシンはstrをコピーします.strと申します.strとstrはメモリが違いますが、保存されている値はすべて1のアドレスです. str’を方法体 に伝達する.メソッドボリュームスタックにメモリを開き、値「cd」 を併存する.メソッド体はstr′の値を変化する、5のメモリアドレス に格納する.メソッド終了、メソッド外印刷str、strが1のアドレスで格納されているため、すべての印刷結果は「ab」 である.
これにより,javaのメソッドパラメータ伝達の全過程を理解した.実は上のほうが大事な言葉です JAvaはメソッドがパラメータを渡すときに変数をコピーし、メソッドボディに転送して実行します.
今日は面白い問題を見つけました.Stringタイプのパラメータをメソッドに入力し、メソッド内で参照の値を変更します.そしてメソッド外でこの値を使用すると,このStringは以前の値であり,変化していないことが分かった.
ここで皆さんに紹介します.javaは伝参時に値していることを知っています. トランスファ および リファレンス転送 .パラメータがベースタイプの場合は値転送、パラメータがパッケージタイプの場合は参照転送です.例:
基本タイプパラメータ
1 public class Test {
2 public static void main(String[] args) {
3 int num = 0 ;
4 changeNum(num);
5 System.out.println("num="+num);
6 }
7
8 private static void changeNum(int num) {
9 num = 1;
10 }
11 }
印刷結果はnum=0
です.パッケージタイプパラメータ
1 public class Test {
2 public static void main(String[] args) {
3 Product p = new Product();
4 p.setProName("before");
5 p.setNum(0);
6 changeProduct(p);
7 System.out.println("p.proName="+p.getProName());
8 System.out.println("p.num="+p.getNum());
9 }
10
11 private static void changeProduct(Product p) {
12 p.setProName("after");
13 p.setNum(1);
14 }
15 }
16
17 class Product {
18 private int num;
19 private String proName;
20
21 public int getNum() {
22 return num;
23 }
24
25 public void setNum(int num) {
26 this.num = num;
27 }
28
29 public String getProName() {
30 return proName;
31 }
32
33 public void setProName(String proName) {
34 this.proName = proName;
35 }
36 }
実行結果:p.proName=after
およびp.num=1
.上記の2つの例は、明らかな値伝達および参照伝達である.しかしパラメータがStringタイプなら?具体的な例を見てみましょう
public class Test {
public static void main(String[] args) { String str = "ab"; changeString(str); System.out.println("str="+str); } private static void changeString(String str) { str = "cd"; } }
運行結果を当ててみましょうか?前の例では、Stringはパッケージタイプであり、参照伝達であり、価値を変えることができ、実行結果は「cd」であるべきである.実際に実行してみましょうstr=ab
、これはどのように説明しますか?もしかしてStringは基本タイプ?話も通じないよ.これはjavaの最下位のメカニズムから言えば、javaのメモリモデルは スタック および スタック .
1. ;
2. , , 。
JAvaはメソッドがパラメータを渡すときに変数をコピーし、メソッドボディに転送して実行します. この言葉は理解しにくいし、この問題を説明する真髄でもある.まず、この言葉に基づいて基本的なタイプの伝達を説明します.問題の真髄.まず、この言葉に基づいて基本的なタイプの伝達を説明します.
パッケージタイプの伝達について説明します.
これにより,javaのメソッドパラメータ伝達の全過程を理解した.実は上のほうが大事な言葉です JAvaはメソッドがパラメータを渡すときに変数をコピーし、メソッドボディに転送して実行します.