で再現:割り当てと参考文献にJavaオブジェクト https://blog.csdn.net/yz930618/article/details/76278997
Javaオブジェクトでの割り当てと参照は、常に非常に漠然とした理解されてきたので、私はこのブログの完全な理解を書くために計画します。
説明と理解を容易にするために、単純なクラスを定義します。
パブリッククラスソリューション{
プライベートint型;
プライベートint型B;
ボイド瀬田パブリック(INT A){
this.a = A;
}
公共ボイド集合B(int型B){
this.b = bの;
}
}
参照して、割当前だが混乱多くの人々を与えるせ、被写体を再訪します現象:
S1 =新しい新しいソリューションソリューション();
s1.setA(1);
s1.setB(2);
解決S2 = S1;
s2.setA(-1);
我々は、そのメンバーに溶液S1クラス・オブジェクト、および変数代入を定義します。その後、別のオブジェクトS2を定義する、と私は今= -1で行った場合のように、S2 = S1、S2、S1、S2の電流値は、それがどのくらいあるのだろうか?
非常に奇妙な、変s2は、s1がそれを変更しますなぜですか?これは完全に理解していないオブジェクトを参照して割り当てられ、話題に以下のエントリされます。
ソリューションS1 =新しいソリューション()の場合、この文は、この文が実行されたアクションは、我々は非常によく知っている、オブジェクトを作成しているが、それは本当に4つのステップで構成されています。
;「新ソリューション」の右、ヒープ領域でソリューションクラスのオブジェクトを作成するためのテンプレートとしてソリューションのカテゴリを表現し
たオブジェクトを作成した後に何も弾力がないので、それはすぐに、コンストラクタソリューションクラスを呼び出します括弧「()」、パラメータは、それが引数なしでデフォルトコンストラクタを呼び出します。
ポイントソリューションオブジェクトのオブジェクト参照に使用される変数ソリューションのカテゴリへの参照を作成するために、左の「ソリューションS1」。C言語でこのポインタを意味すると理解することができます。
「=」、等価演算子は、オブジェクト参照が作成したばかりのオブジェクトs1のソリューションによって指さ表します。
だから、この文は、2つのエンティティが含まれています:1は、1つのオブジェクトそのものである、オブジェクト参照変数です。
それらの間のオブジェクト、参照との関係のイメージを説明するために、あなたは、類推を行うことができます。
Aが家を持って、彼は再びB、その後、BはホームアドレスAを知っているだろう、ホームアドレスをアドレスBに語ったとC.に語りました この場合、BとCはホームアドレスAを認識しているが、実際にAを収容するために属しています この時点での場合は、家族にBは事を取り、その後、C以下同じものを見つけるために行ってきました。だからそのBを知っているし、Cはホームアドレス、いつでもアクセスすることができますが、それは本当にユニークではありません。
だから、私たちは次のような結論を持っています:
上記の説明から、それを推測、私たちは次のような結論を得ることができます:
(1)オブジェクト参照は、0または1で被写体(人が家のアドレスを知ることができるか、知らないかもしれない)を指すことができます。
(2)オブジェクトは、それへのNの参照を持つことができます(Nの個人が家の住所を知ることができますがあります)。
Javaオブジェクトとリレーショナルの参照は相互に関係が、互いに独立であると言うことができます。主に互いに独立して:参照変更することができ、それが他のオブジェクトを指し示すことができます。
収納スペースからは、オブジェクトや参照も独立しており、それらは別々の場所に格納され、オブジェクトは通常、ヒープ上に格納され、参照が速く、スタックに格納されます。
参照オブジェクトが操作基準の複数であってもよい、別のオブジェクトを指すことができます。我々は上記に述べたように、S1とS2の両方のオブジェクトが同じを指します。2つの参照が同じオブジェクトを指しているので、その後、どんな参照コンテンツオブジェクトが変更され、そして一つだけを、s1でかつ自然に同じコンテンツを取得S2では、オブジェクトを操作しません。
オブジェクトと参照との間の関係をさらに理解した後、引数を見て。Javaはパラメータを渡すの唯一の方法です。値によって渡され、それが値で渡されたJavaすべてです。入ってくる方法は事の基本的なタイプである場合は、この基本的なタイプのコピーを取得します。参照が合格している場合は、参照先のコピーを取得します。:
同様に、例えば:
パッケージ一時ファイル;
パブリッククラスソリューション{
//渡されたパラメータの基本的なタイプの
パブリック静的ボイドFUN1(int型M){
M = 100;
}
基準値を変更することなく、オブジェクトの//パラメータ、
パブリック静的ボイドfun2(StringBufferのS){
s.append( "fun2を");
}
基準値変更オブジェクトの//パラメータ、
パブリック静的ボイドFUN3(StringBufferのS)を{
SはStringBufferの新しい新しい( "FUN3を")=;
}
パブリック静的無効メイン(文字列[] args){
int型I = 1;
ソリューションS1 =新しいソリューション();
System.out.println(I); // I = 1つ
のStringBuffer SS =新しいStringBufferの( "メイン");
System.out.println(ss.toString()); //メイン
fun2(SS)。
System.out.println(ss.toString()); // mainfun2
fun3(SS)。
System.out.println(ss.toString()); // mainfun2
}
}
FUN1におけるパラメータmの値が変化するが、上記の結果は、パラメータFUN1方法は、プリミティブ型であるが、それはMに影響を及ぼしません。
Fun2パラメーターは、従って、複数の操作対象を、SSも影響され、同じオブジェクトのオブジェクトメソッド、パラメータはS SSを通過するとき、SSのコピーが得られるので、SおよびSS点です。
fun3パラメータは、オブジェクトのメソッドであるがパラメータがS SSを通過するとき、SS Sコピーは、得られたが、オブジェクトの変化は何の関係を持っていないS、SおよびSSへの再割り当てのS fun3によって指されます異なるオブジェクトには、SSのポイントなので、どんなSの操作、ssは影響を受けないことはありません。