Stringが値伝達か参照伝達か

11251 ワード

本文は慕課網の文章から来た.https://www.imooc.com/article/288336
今日は面白い問題を見つけました.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はメソッドがパラメータを渡すときに変数をコピーし、メソッドボディに転送して実行します. この言葉は理解しにくいし、この問題を説明する真髄でもある.まず、この言葉に基づいて基本的なタイプの伝達を説明します.
問題の真髄.まず、この言葉に基づいて基本的なタイプの伝達を説明します.
  • 仮想マシンは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はメソッドがパラメータを渡すときに変数をコピーし、メソッドボディに転送して実行します.