Java でプリミティブの参照渡し効果を実現するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-12 22:15:03
オリジナル
936 人が閲覧しました

How Do You Achieve a Pass-by-Reference Effect for Primitives in Java?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート