JAVAにおける伝値か伝引用かについての自己思考

2596 ワード

最近ある友達が私にこんな質問をした.

public class Test{
    public static void change(String str){
         str="123";

    }

     public static void main(String[] args){
        String word="abc";
        change(word);
        System.out.println(word);
    }
}

この出力の結果は何ですか?
考えてみると、Stringはオブジェクトで、wordはJVMのString定数プールの「abc」オブジェクトを指しています.
結果は間違っていて、思い出してみるとこのようなJAVAの基礎問題はすべて答えて本当に汗をかいた.
ここ数日よく考えて、私がここ数日考えていたことを書きました.
間違いがあったらレンガを撮ってください.
メソッド参照が値を伝達するか参照を伝達するかを理解するには、まずJAVAでのメソッドの処理手順を理解します.
メソッドが呼び出されると、JAVAではメソッドのメモリブロックが開き、すべてのローカル変数がインスタンス化されます(
これが局所変数がスレッドの安全を保証できる本質である).
メソッドの入力パラメータは、上記の例で説明するように処理されます.
上のmainメソッドがchang(String str)を呼び出すと、関数の場合、プログラムは実際にこのようなことをしています.
1.change(word);
「abc」参照をchangeメソッドに渡し、changeメソッドはJVMにメソッドメモリブロックを割り当てられる
2.String str=word;
changeメソッドメモリが急速に開かれた後,スタックにstrが開かれ,「abc」の参照が参照strに与えられると,wordとstrは関係がないことが明らかになった.
3.str="123";
このときstrの引用を「123」に向けただけです
この分析から私たちが望んでいる結果が得られる.
基本的なタイプはすべて値によって伝達され、値の間のCOPYであるため、答えは一目でわかる.
しかし、対象タイプの入参についてはどうでしょうか.

 public class RefTest{
    public static void changeUser(User user){
      user=new User();
      user.setName("none");
    }
    public static void changeUserName(User user){
      user.setName("showtime");
    }

   public static void main(String[] args){
       User userMain=new User();
       userMain.setName("lan");
       changeUserName(userMain);
       System.out.println(userMain.getName());
       changeUser(userMain);
       System.out.println(userMain.getName());
    }
}

class User{
    private String name;
    public void setName(){
       this.name=name;
    }
    public String getName(){
       return this.name;
     }
}

Stringについて上の学生を読んで、私は方法changeUserに対してきっと正しい答えを出すことができると信じています:対象を変更しません.
しかし、changeUserName()という方法はありますか?
分析を続けます
1.changeUser(user);
userリファレンスをchangeUserメソッドに渡し,changeメソッドはJVMにメソッドメモリブロックを割り当てられる
2.String str=word;
changeUserメソッドのメモリがもうすぐ開くと、スタックにuserが開き、mainメソッドのuserMainの参照が参照userに与えられます.
3.肝心な一歩が来た、user.setName(「showtime」);
第2ステップではuserMainオブジェクトの参照をuserに与えると述べたので,オブジェクトのメソッドを呼び出すときに役立ち,名前は最後にshowtimeに変更される.
后记:これは初めてJAVAEYEに自分で书いたものを出して、まず简単な手から始めて、ほほほ、みんなが私を支持することを望んで、见终わって私を覚えています.私はみんなにもっと多くの私の思考と経験を持ってきます.