免責事項:この記事は元の記事CSDNブロガー「zejian_」であり、BY-SAの著作権契約CC 4.0に従って、再現し、元のソースのリンクと、この文を添付してください。
オリジナルリンクします。https://blog.csdn.net/javazejian/article/details/51192130
Javaとのインタビューで、参照によって渡された値を提供するには、通常、今日、我々は、我々はまず、それがJavaメソッドのパラメータであり、この問題は通常、相対的な用語の関数であることを認識しなければならない。この問題について話をする必要があり、関与していますのは、プログラミング言語のメソッド(または関数)に渡されたパラメータは約2つの専門用語を見てみましょう:
(値による呼び出し)値で呼び出し
参照によって呼び出し(参照による呼び出し)
受信値表現によって、いわゆるコールが発呼者によって提供される値であり、参照によってコールは、C言語の単語が問題ポインタ場合方法はもちろん、Javaやないポインタの、(発呼者によって供給された変数のアドレスを受信し、前記しましたコンセプト)。ここでは、メソッドが参照を渡すために、対応する変数の値を変更することができますが、コールに対応する値を渡すために、変数の値を変更することはできませんのでご注意する必要がある場合、この文は、この値によって、コールの基本的な違いは非常に重要であると当然のことながら、参照することによって呼び出します私たちは徹底的に友人の以下の図を分析しなければならない、それは問題ではない、理解していません。
私たちは、Javaプログラミング言語は確かに、すなわち値で呼び出し、値による呼び出しを使用しているため、これは、間違っている以前のJavaは、呼び出し元への参照には存在しないと述べました。その方法は、すべてのパラメータ値のコピーを入手することで、方法はそれのいずれかのパラメータ変数に渡される変更されません。例を見てみましょう:
パッケージcom.zejian.test; / ** *値によってJavaコール * @author zejian * / パブリック クラスCallByValue { プライベート 静的 INT X = 10 ; 公共 静的 ボイド updateValue(int型の値){ 値 = 3 * 値; } パブリック 静的 ボイドメイン(文字列[]引数){ するSystem.out.println( "コール前x値:" + X); updateValue(X) のSystem.out.println( "呼び出し後のXの値:" + X ); } }
次のようにプログラムを実行し、結果は以下のとおりです。
xの値の前に呼び出されます:10
コール後のxの値:10
その後、私たちは一緒に具体的な実装プロセスを見て、xの値が変更されません見ることができます。
分析:
1)値は、値x(すなわち、10)のコピーに初期化されます
2)値は30で乗算された3に等しいが、この時点でのxの値はまだ10であることに注意してください!
この方法の3)の後に、可変パラメータ値がもはや使用され、回収されました。
結論:基本型配信方法のパラメータのデータ型(数値、およびブール値)、この方法は、基本データ型のパラメータを変更することが可能です。
もちろん、参照データ型のJavaは、基本データ型に加えてありますが、それは、オブジェクト参照である場合、このタイプのデータのどのような状況の一種でありますか?私たちは例を見たよう:
ユーザーオブジェクト型を宣言します。
パッケージcom.zejian.test。 パブリック クラスユーザー{ プライベート文字列名; プライベート int型の年齢; パブリックユーザー(文字列名、int型の年齢){ この .nameの= 名前; この .age = 年齢; } パブリック文字列のgetName(){ 戻り名。 } 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } 公共 INT getAge(){ 戻り年齢; } 公共 ボイド setAge(int型の年齢){ この .age = 年齢; } }
次のように実行クラスは次のとおりです。
パッケージcom.zejian.test。 / ** * javaの中的按值调用 * @author zejian * / パブリック クラスCallByValue { プライベート 静的ユーザーユーザー= nullを。 パブリック 静的 ボイドupdateUser(ユーザー・学生){ student.setName( "Lishen" ); student.setAge( 18 )。 } パブリック 静的 ボイドメイン(文字列[]引数){ ユーザ = 新しいユーザー( "zhangsan"、26 ); System.out.println( "调用の前のユーザー的值:" +())user.toString updateUser(ユーザ) のSystem.out.println( "値の後にユーザを呼び出す:" + user.toString()); } }
結果は以下の通りであります:
ユーザーを呼び出す前の値:ユーザー[= 26名= zhangsan、年齢]
ユーザーを呼び出した後の値:ユーザー[= 18名= Lishen、年齢]
明らかに、ユーザーの値が変更されています、それは、メソッドのパラメータの型が参照型である場合のは、このプロセスを分析してみましょう、その後、対応する基準値が変更されます入力、と言うことです。
プロセスの分析:
1)学生のユーザ変数はコピーの値に初期化され、これはオブジェクトへの参照です。
内部基準値が変更されながら、2)呼設定方法学生変数は、参照オブジェクト、ユーザオブジェクトと学生ユーザに作用します。
3)メソッドの後、生徒の変数は、もはやそれがリリースされた、使用されず、ユーザーはまだユーザーオブジェクトを指して、変更されません。
結論:配信方法が指すオブジェクトのデータ・タイプの基準パラメータ値を修正するための方法参照タイプ引数のデータ・タイプです。
データのここでは2つのタイプの分析を介して送信されているが、基本データ型はまた、前者はオブジェクトの基準値が指摘修正する元のデータの値を変更しないであろうデータ転送の違いを理解し、参照型を渡します。上記実施例により、我々は、Javaはまた、値によってコールが感じるかもしれないと、ああを参照することによって、このような理解は、現象が表面上に通過するが、上記引用文献によってコールを反映して、誤解を招くが、Javaであること残念を呼び出しますそれが唯一の値で呼び出し、参照することによって呼び出すことはありません。ここでモンゴルに強制的に人々の推定数は、ここで我々は(我々が説明参照根本的な違いによる値と呼び出しによって通話の開始を思い出す)説明するために反例を渡されます。
パッケージcom.zejian.test; / ** *値によって、Javaコール * @author zejian * / パブリック クラスCallByValue { プライベート 静的ユーザーユーザー= ヌル; プライベート 静的ユーザーSTU = ヌル; / ** *為替二つのオブジェクト * @param X * @param Y * / パブリック 静的 ボイドスワップ(ユーザX、ユーザY){ ユーザーTEMP = X; X = Y; Y = TEMP。 } パブリック 静的 ボイドメイン(文字列[]引数){ ユーザー = 新しい新しいユーザ(「ユーザ」、26である); STU = 新しい新規のユーザ(「STU」、18である); のSystem.out.println(「ユーザの値の前に呼び出します」 + user.toString()); のSystem.out.println( "STU値呼び出しの前に" + stu.toString()); スワップ(ユーザ、STU) のSystem.out.println(「ユーザー値を呼び出した後。 "+ user.toString()); のSystem.out.println( " STU値呼び出しの後:「+ stu.toString()); } }
のは、私たちの前にスワップ機能を介して2つの変数のユーザーとSTU値を交換してみましょうすることは、メソッドをコールする場合であれば、Javaが参照ワードによってコールであることを意味する値に対応する参照変数を渡す参照することにより修飾することができると言っこの方法は、データの交換を可能にする交換、実際の業績は、次のとおり
ユーザーを呼び出す前の値:ユーザー[= 26名=ユーザー、年齢]
コールSTU値の前に:ユーザー[名= STU、年齢= 18]
ユーザー[名=ユーザー、年齢= 26]:ユーザーのための値を呼び出した後
STU値を呼び出した後:ユーザー[名= STU、年齢= 18]
我々はつまり、メソッド、変数、ユーザーとSTUの参照に格納されているオブジェクトを変更しません、ユーザーとSTUの値が変更されていないことがわかりました。Xスワップ方式パラメータおよびyは参照されるオブジェクトの2枚のコピーに初期化され、この方法は、最終的に、何をしたが無駄ベールであった、それの2つのコピーのこの交換の値です。方法Xの最後に、Yが破棄され、そしてこの方法の前に、参照元の変数のユーザーとSTU依然として参照されるオブジェクトが呼び出されます。
このプロセスを使用しても、Javaプログラミング言語は、オブジェクトの呼び出しへの参照が実際に値によって渡されたオブジェクトの参照が行われているされていない、もちろん、どこ我々はこれは単純な参照による値と呼び出して通話、及び必須の違いであることを理解することができます下線でも、参照データ型を渡すにはJavaの機能を理解し、ちょうど何の基準値をコピーして、我々は、彼らがまた、オブジェクトを指し示すための参照データを変更することができたが、これはまだ値呼び出しによる参照呼び出しではありません。
要約:
この方法は、パラメータ(数値、およびブール)の基本的なデータ・タイプを変更することはできません。
オブジェクトの状態を基準点を変更し、それでも値の代わりに参照呼び出しによって呼び出す方法。
転写プロセスの上記二種類の値をコピーしてきました。
参考文献:Javaのコア1巻