JAVAにおける伝値か伝引用かについての自己思考
最近ある友達が私にこんな質問をした.
この出力の結果は何ですか?
考えてみると、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であるため、答えは一目でわかる.
しかし、対象タイプの入参についてはどうでしょうか.
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に自分で书いたものを出して、まず简単な手から始めて、ほほほ、みんなが私を支持することを望んで、见终わって私を覚えています.私はみんなにもっと多くの私の思考と経験を持ってきます.
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に自分で书いたものを出して、まず简単な手から始めて、ほほほ、みんなが私を支持することを望んで、见终わって私を覚えています.私はみんなにもっと多くの私の思考と経験を持ってきます.