ホームページ >Java >&#&チュートリアル >Java が値渡しか参照渡しかを分析してみましょう。
この記事では、java に関する関連知識を提供します。主に、Java が値渡しか参照渡しかに関する関連問題を紹介します。一緒に見てみましょう。お役に立てば幸いです。みんなに、役に立ちました。
推奨学習: 「java ビデオ チュートリアル 」
この記事の目的: Java 言語が値渡しであるかどうかを確認します。参照渡しとパラメータ渡しの Java 実装原則。
問題の導入:
最初にコード セグメントを読んでください:
public static void main(String[] args){ Person p=new Person("张三"); f(p); System.out.println("实参:"+p);}public static void f(Person p){ p.name="李四"; System.out.println("形参:"+p);}
実行結果:
仮パラメータ :person{name="李思"}
実際のパラメータ :person{name="李思"}
オブジェクト変数をメソッドに渡し、次に、メソッド Attributes 内でオブジェクトを変更し、実パラメータと仮パラメータを出力します。表面上、実パラメータと仮パラメータの値は変更されています。Java は参照転送もサポートしていますか?
答えは次のとおりです。Java 言語は値の転送のみをサポートし、参照の転送はサポートしません。 |
値の受け渡しと参照の受け渡しの違いは、仮パラメータの変更が実際のパラメータに影響を与えるかどうかであることがわかります。
public static void main(String[] args){ int a=1; f(p); System.out.println("实参:"+a);}public static void f(int a){ a=2; System.out.println("形参:"+a);}2. 参照データ型のパラメータの受け渡し質問で紹介された例では、仮パラメータの変更が実際のパラメータに影響を与えるように見えますが、新しいオブジェクトを作成して仮パラメータに割り当て、実際のパラメータと仮パラメータを出力しますが、この 2 つは相互に影響しません。これは、Java が参照転送に準拠していないことを意味します。
public static void main(String[] args){ Person p=new Person("张三"); f(p); System.out.println("实参:"+p);}public static void f(Person p){ p=new Person("李四"); System.out.println("形参:"+p);}
なぜこれが起こるのかを理解する必要があります現象、Java の背後にある基本原則を理解する必要があります:
JVM は多くの領域、オブジェクトに分かれています。作成したデータ型はヒープに配置され、基本データ型とローカル変数はスタックに配置されます。基本データ型を渡す場合、データのコピーが作成されてメソッドに渡されるため、実際のパラメータは影響を受けません。図に示すように、仮パラメータを変更します。 オブジェクトはヒープ領域に配置されているため、このオブジェクトを操作するにはオブジェクトの参照のみを使用できます。
オブジェクト参照がメソッドに渡されると、参照のコピーが実際に作成され、同時に同じオブジェクトを指します。オブジェクトが仮パラメータ参照を通じて操作されると、実際のパラメータが変更されたかのようになります実際には、オブジェクトの内容は変更されていますが、オブジェクト変数は変更されておらず、実際のパラメータ自体は変更されていないため、質問で紹介されている例は理解するのが難しくありません。
仮パラメータを再割り当てしても、実パラメータは何の影響も受けません。この時点では、実パラメータと仮パラメータはすでに 2 つの異なるオブジェクトを指しています。
したがって、Java は値の転送のみをサポートします。
推奨される学習: 「Java ビデオ チュートリアル 」
以上がJava が値渡しか参照渡しかを分析してみましょう。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。