1.参照の概念に渡された値が渡されました
引数に関わる形のものを理解する方法を渡す前に。
パラメータの形式で:オブジェクトが着信コール関数パラメータを受信するために使用される場合、パラメータは、本体の関数名の定義及び機能に使用されます。
実パラメータ:時間基準、呼び出し元の関数と呼ばれる関数との間のデータ転送関係を持つ関数を呼び出します。あなたはと呼ばれるパラメータの後に括弧で、呼び出し側の関数に関数名を関数を呼び出すと、「実際のパラメータを設定します。」
:ことが理解できるパラメータは、パラメータ定義された関数であるパラメータは、引数は呼び出しパラメータ抽象引数であるが、
値が渡される:対応する仮パラメータに実際のパラメータ値を渡すメソッド呼び出しは、元の値の受信したコピーの関数であり、二つの同一のメモリがあり、その場合、基本的なタイプ背面、即ち、仮パラメータと実際のパラメータは、操作方法は、それが実際のパラメータの値には影響を与えない、パラメータの値を変更することです。
参照渡し:直接、その後行われたパラメータを変更するために、それは機能の実際のパラメータに影響を与えます、関数に渡された実引数を扱う関数を呼び出すときを指します。
:の焦点描画転送値との間の主な違いを参照渡し
値の転送 |
参照渡し |
コピーを作成し、あなたは関数本体で元の値を変更することはできません。 |
コピーを作成せずに、元の値が関数本体で変更することはできません |
意味の図のコピーを作成します。
コピーするために呼び出すために、コピーが言っているの引数を作成し、そのコピー機能の身体へのパス。コピーを作成していない場合は、このステップは発生しませんコピーします。
値渡された栗の場合:
パブリッククラスTEST01 {
パブリック静的無効メイン(文字列[] args){
int型、A = 1、B = 2。
スワップ(A、B)。
System.out.println( "A =" + A)。
System.out.println( "B =" + B)。
}
パブリック静的ボイドスワップ(INT A、INT B){
int型のTEMP =。
= B;
B = TEMP。
}
}
結果:
A = 1 、B = 2
上記栗は、関数は、B交換機に実装するが、関数呼び出しの後、結果は依然として出力Aとなるように、元の値のB、機能の操作は、インビトロ機能では、Bの値に身体に影響を与えません。
基準テストに合格しなかった栗、参照渡しされたC ++で、パラメータまたはポインタのエイリアスとして定義され、C ++、でテストに興味があるかもしれません。
神話:それは値によって渡される一般的なタイプである場合に渡されたパラメータ、およびオブジェクトが参照によって渡され、もし。これは間違っています!!!!!
値が渡さ2.java
かかわらず、パラメータのタイプの基本的なまたは参照データ型であるJavaでは、値によって渡されます。データの次のタイプのパラメータを参照するために、我々は、上記の基本的なデータ型のパラメータの受け渡しの栗を持っています。
パブリッククラスTEST01 {
パブリック静的ボイドスワップ(スチューデントST1、学生ST2){
学生TEMP = ST1。
ST1 = ST2;
ST2 =温度;
}
パブリック静的無効メイン(文字列[] args){
学生ST1 =新しい生徒( "张三"、20);
学生ST2 =新しい学生( "李四"、20);
スワップ(ST1、ST2)。
System.out.println( "ST1:" + ST1)。
System.out.println( "ST2:" + ST2)。
}
結果:
ST1:学生[名=ジョー・スミス、年齢= 20である]
ST2:学生[名=ジョン・ドウ、年齢= 20]
たとえば、オブジェクトは、ST1指摘し、ST2は変更されません。
このとき、Javaが値渡しされるので、あなたは、頼むかもしれないので、実際の参加者はコピーが起こり、そのコピーはそれが何ですか?答えは:オブジェクトのアドレスのコピーがヒープ上にあります。栗を確認します:
公共TEST01する{クラス
のパブリック静的ボイドプリント(スチューデントSTU1、学生STU2){
;スチューデントTEMP = STU1
STU1 = STU2;
STU2 = TEMP;
のSystem.out.println( "交換機能本体後の印刷STU1:" + STU1)を、
System.out.println( "関数本体印刷STU2の交換後:" + STU2);
}
公共の静的な無効メイン(文字列[] args){
学生STU1新しい新しい学生=( "STU1"、20);
学生=新しい新しいSTU2学生( "STU2"、30);
印刷(STU1、STU2);
}
}
結果:
印刷機能体STU1の交換後:学生[名= STU2、年齢= 30 ]
交換機能本体のSTU2を印刷した後:学生[名= STU1、年齢= 20]
結果から分かるように、関数の本体にSTU1とSTU2尖った物体値の転送中にスタック内のそのアドレスのコピーので、変更されません。
メモリに見てみましょう方法です。
Javaの渡された値がアドレスのコピーであるため、この時点で、あなたは、私はアドレスの内容を指摘を変更することはできません、頼むかもしれませんか?答えは:もちろん
静的ボイドchangeInf公開(スチューデントSTU){
stu.setName( "私は名前を変更");
}
公共の静的な無効メイン(文字列[] args){
学生学生新しい新しいSTU =( "ジョー・スミス"、18れている);
changeInf(STU );
のSystem.out.println(STU);
}
結果:
学生[名前=私は名前を変更、年齢= 18]
オブジェクトの内容を変更します
結論:Javaの値のみが渡されない理由Javaの別名ポインタと参照バーがないので、それであってもよいです。