ホームページ  >  記事  >  Java  >  Javaの値渡しと参照渡しの違いは何ですか

Javaの値渡しと参照渡しの違いは何ですか

百草
百草オリジナル
2024-01-16 16:18:45768ブラウズ

Java 値転送と参照転送の違い: 1. 基本データ型の転送、2. オブジェクトの転送、3. 参照ポインティングの変更。詳細な紹介: 1. 基本データ型の転送. 基本データ型の場合、Java は値転送を使用します. 基本データ型の変数がパラメータとしてメソッドに渡されるとき、値ではなく変数の値が実際に転送されます。変数の参照、つまりメソッド内でのこのパラメータの変更は元の変数の値に影響を与えないことを意味します; 2. オブジェクトの転送、オブジェクト参照の場合、状況は異なります。

Javaの値渡しと参照渡しの違いは何ですか

このチュートリアルのオペレーティング システム: Windows 10 システム、DELL G3 コンピューター。

Java におけるパラメータの受け渡しは、主に値の受け渡しと参照の受け渡しの 2 種類に分かれます。これら 2 つの配信方法には、概念的にも動作にも明らかな違いがあります。

まず、基本的な概念を理解します:

1. 値による受け渡し: 値の受け渡しでは、パラメーターのコピーが渡されます。コピーを変更しても元のデータには影響しません。

2. 参照渡し: 参照渡しでは、オブジェクトの参照アドレスが渡されます。参照への変更は、元のデータに直接影響します。

これら 2 つの転送方法の違いを詳しく分析してみましょう:

1. 基本的なデータ型の転送:

基本的なデータ型 (int、char、float など)など)、Java は値の転送を使用します。プリミティブ データ型の変数をパラメーターとしてメソッドに渡す場合、実際には変数への参照ではなく、変数の値が渡されます。これは、メソッド内でこのパラメーターを変更しても、元の変数の値に影響を与えないことを意味します。

例:

public static void modify(int value) {  
    value = value + 1;  
}  
  
public static void main(String[] args) {  
    int a = 5;  
    modify(a);  
    System.out.println(a); // 输出:5,而不是6  
}

2. オブジェクトの転送:

オブジェクト参照の場合は、状況が異なります。オブジェクト参照をパラメータとしてメソッドに渡す場合、実際に渡されるのはオブジェクト自体ではなく、オブジェクトの参照アドレスです。これを「参照渡し」と呼びます。このメソッドでは、この参照を通じてオブジェクトの内容を変更できます。この変更は元のオブジェクトに影響します。ただし、参照のポインタを変更することはできません。つまり、新しいオブジェクトへの参照ポイントを作成することはできません。

例:

public static void modify(StringBuilder builder) {  
    builder.append(" modified");  
}  
  
public static void main(String[] args) {  
    StringBuilder strBuilder = new StringBuilder("Hello");  
    modify(strBuilder);  
    System.out.println(strBuilder.toString()); // 输出:"Hello modified"  
}

上の例では、StringBuilder はオブジェクトですが、参照が新しい StringBuilder オブジェクトを指すようにするのではなく、参照を通じてオブジェクトの内容を変更するだけです。 。したがって、これは依然として値渡しの特殊なケースです。この参照をメソッド内で使用して、元の strBuilder 参照が指すオブジェクトを変更することはできません。つまり、strBuilder に新しい StringBuilder オブジェクトを参照させることはできません。

3. 参照ポイントを変更する:

メソッド内の参照ポイントを変更したい場合 (つまり、参照が新しいオブジェクトを指すようにする場合)、Java はこれをサポートしていません。アプローチの。これは、Java の設計哲学の 1 つが、基本的なデータ型だけでなく、すべてのオブジェクトが値によって渡されるためです。これは、プログラマが参照を誤用してオブジェクトのカプセル化を破壊することを防ぐためでもあります。例:

public static void changeReference(StringBuilder builder) {  
    builder = new StringBuilder("Another object"); // 这是合法的,但并没有改变原始的builder引用所指向的对象。  
}

この例では、ビルダーのローカル変数が新しい StringBuilder オブジェクトを指すようにしていますが、これによって元のビルダー参照が指すオブジェクトは変更されません。この動作は、参照渡しよりも値渡しに近いです。

以上がJavaの値渡しと参照渡しの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。