メソッド呼び出しは、標準的なコンピューターサイエンス用語です。メソッド呼び出しは、パラメーターの合格状況に従って、値の呼び出し(参照による呼び出し)および参照呼び出し(値ごとの呼び出し)に分割されます。世界にはこれら2つのタイプの呼び出しには多くの定義があります。最も一般的なことわざは、値が値の呼び出しであり、アドレスは参照コールであるということです。これは実際には非常に不適切です。これらのステートメントは、Javaのオブジェクトパラメーターの合格が参照呼び出しであることを簡単に思い出させることができます。実際、Javaのオブジェクトパラメーターの渡されたパスは、依然としてバリューコールです。
まずコードを使用して、Javaオブジェクトパラメーターがバリューコールである理由を確認しましょう。
Public Class Employee {public String name = null;公務員(文字列n){this.name = n; } // 2つの従業員オブジェクトを交換public static void swap(従業員E1、従業員E2){従業員Temp = e1; E1 = E2; E2 =温度; System.out.println(e1.Name+""+e2.Name); //結果の印刷:li si zhang san} // main function public static void main(string [] args){従業員= new Employee( "Zhang San");従業員マネージャー=新しい従業員( "li si");スワップ(ワーカー、マネージャー); System.out.println(worker.name+""+manager.name); //印刷の結果はまだ次のとおりです:Zhang San Li Si}}上記の結果は非常に残念です。正式なパラメーターオブジェクトE1とE2の内容は交換されましたが、実際のパラメーターオブジェクトワーカーとマネージャーはコンテンツを交換しませんでした。ここで最も重要な理由は、正式なパラメーターE1とE2が実際のパラメーターワーカーとマネージャーのアドレスコピーであることです。
誰もが知っているように、Javaでは、オブジェクト変数名は実際にヒープ内のオブジェクトのアドレスを表します(プロフェッショナル用語はオブジェクト参照と呼ばれます)。 Javaメソッドが呼び出されると、パラメーターはオブジェクトへの参照を渡します。重要なことに、正式なパラメーターと実際のパラメーターで占めるメモリアドレスは同じではありません。正式なパラメーターの内容は、実際のパラメーターに保存されているオブジェクト参照のコピーにすぎません。
JVMメモリ管理のJavaスタックのローカル変数領域をある程度理解している場合(「Java Virtual Machine Architecture」を参照)、上記の文をよく理解できます。 JVMが上記のプログラムを実行すると、メインメソッドを実行し、スワップメソッドがJavaスタックのスタックフレームと呼ばれる2つのメモリスペースをプッシュします。メインスタックフレームにローカル変数領域と呼ばれるメモリがあり、実際のパラメーターオブジェクトワーカーとマネージャーへの参照を保存します。スワップスタックフレームのローカル変数領域は、正式なパラメーターオブジェクトE1およびE2への参照を保存します。 E1およびE2の参照値は労働者およびマネージャーの値と同じですが、異なるメモリ空間を占有しています。 E1とE2の参照が交換されると、以下の図は、ワーカーとマネージャーの参照値にまったく影響しないことを明確に示しています。
javaオブジェクトパラメーターの渡されたのは、アドレス(参照)が渡されますが、依然として値コールです。リファレンスコールとバリューコールを正確な定義を提供する時が来ました。
値による呼び出し:パラメーターの通過プロセス中に、正式なパラメーターと実際のパラメーターは、2つのまったく異なるメモリスペースを占めます。正式なパラメーターによって保存されているコンテンツは、実際のパラメーターによって保存されているコンテンツのコピーです。実際、Javaオブジェクトの通過は、正式なパラメーターと実際のパラメーターによって保存されているコンテンツが従来の意味では変数値ではなく、変数のアドレスであることを除いて、この定義を満たしています。さて、振り返ってみてください:変数のアドレスも値ではありませんか?
参照による呼び出し:パラメーターの渡されたプロセス中に、正式なパラメーターと実際のパラメーターは完全に同じメモリ空間であり、2つは互いに区別されません。実際、正式なパラメーター名と実際のパラメーター名は、プログラミングのシンボルが異なります。プログラム操作中、メモリに保存されているスペースが最も重要なことです。異なる変数名は、メモリストレージスペースが異なる方法で占有されていることを示していません。
一般的に、2つの呼び出しの基本は、値またはアドレスが渡されるかどうかではなく(結局、アドレスも値でもあります)、正式なパラメーターと実際のパラメーターが同じメモリ空間を占めるかどうかです。実際、C/C ++で通過するポインターパラメーターも値の呼び出しです。信じられない場合は、次のCコードを試してください!
#include <stdio.h> void swap(int *a1、int *b1){int *t = a1; A1 = B1; b1 = t; } int main(){int x1 = 100; int x2 = 200; int *a =&x1; int *b =&x2; printf( "%d%d/n"、*a、*b);スワップ(a、b); printf( "%d%d/n"、*a、*b); 0を返します。 }ただし、C/C ++には参照呼び出しがあります。これは、参照int aと呼ばれる可変宣言方法です。 int&ra = a;ここで、raはaのエイリアスです。メモリの2つに違いはありませんが、同じメモリ空間を占有します。参照(エイリアス)にパラメーターを渡すことは、参照呼び出しの特性と一致しています。 voidスワップの実行結果(int&a1、int&b1)を試すことができます。
この記事を通して、Javaメソッドパラメーターが参照または値と呼ばれるかどうかを知る必要があります。