Java のプリミティブの参照渡しと同等
C では、参照渡しを使用すると、関数がスコープ外の変数を変更できます。ただし、Java は値渡しで動作するため、プリミティブに対して同じ効果を達成することが困難です。
次のコードを考えてみましょう:
public class XYZ { public static void main(String[] args) { int toyNumber = 5; XYZ temp = new XYZ(); temp.play(toyNumber); System.out.println("Toy number in main " + toyNumber); } void play(int toyNumber) { System.out.println("Toy number in play " + toyNumber); toyNumber++; System.out.println("Toy number in play after increment " + toyNumber); } }
このコードの結果は次のとおりです:
Toy number in play 5 Toy number in play after increment 6 Toy number in main 5
C とは異なり、 play() 内で toyNumber に加えられた変更は main() の値に影響しません。これは、Java が参照ではなくコピーによってプリミティブ値を渡すためです。
代替アプローチ
1.オブジェクト ラッパーを使用します:
1 つのアプローチは、プリミティブをオブジェクトでラップし、そのオブジェクトを参照によって渡すことです:
class ToyNumber { int toyNumber; }
public static void main(String[] args) { ToyNumber toyNumber = new ToyNumber(5); XYZ temp = new XYZ(); temp.play(toyNumber); System.out.println("Toy number in main " + toyNumber.toyNumber); }
void play(ToyNumber toyNumber) { System.out.println("Toy number in play " + toyNumber.toyNumber); toyNumber.toyNumber++; System.out.println("Toy number in play after increment " + toyNumber.toyNumber); }
このメソッドでは、次のことが可能になります。 play() で行われた変更は main() に反映されます。ただし、オブジェクトを作成することで追加のオーバーヘッドが発生します。
2.値を返す:
別のオプションは、変更された値を返すことです:
int play(int toyNumber) { ... return toyNumber; }
public static void main(String[] args) { int toyNumber = 5; toyNumber = temp.play(toyNumber); System.out.println("Toy number in main " + toyNumber); }
このアプローチは機能しますが、戻り値を受け取るためにコールサイトを変更する必要があります。
3.静的変数またはクラス変数:
play() と main() が同じクラスまたはクラス インスタンス内にある場合は、静的変数またはクラス変数の使用を検討してください:
class XYZ { static int toyNumber = 5; ... }
public static void main(String[] args) { XYZ.play(); System.out.println("Toy number in main " + XYZ.toyNumber); }
static void play() { ... XYZ.toyNumber++; ... }
この方法では、両方の関数で同じ変数を変更できますが、同時実行の問題が発生する可能性があるため、マルチスレッド アプリケーションには推奨されません。
以上がJava でプリミティブの参照渡し効果を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。