3

オブジェクトを関数のパラメーターとして渡し、それに変更を加えると、変更はオブジェクトに「とどまる」ことに気付きます。しかし、整数の場合はそうではありません。

public void start() {
    int x = 100;
    modify(x);
    // I would like x to be 200 now. But it isn't :(
}

public void modify(int y) {
    y *= 2;
}

それで、基本的に、上記のコードで私が望んでいたことを達成する方法はありますか?(オブジェクト参照のように)そのような整数を変更することは可能ですか?

4

4 に答える 4

4

で作業している間primitives、「 」の概念はありませんreference。ただし、次のようなことを行うことで、目的を達成できます。

x = modify(x);コードが欲しいかもしれません。

メソッド呼び出しxの結果が含まれるようになりました。modify(x)

于 2012-09-24T03:50:05.530 に答える
3

それをしてはいけない。プリミティブは値渡しです。(参照も値によって渡されます。オブジェクト参照を変更することはできません。参照されているオブジェクトのみを変更できます。) できる最善の方法は次のとおりです。

public void start() {
    int [] x = {100};
    modify(x);
    // x[0] is now 200 :)
}

public void modify(int []y) {
    y[0] *= 2;
}

配列参照xは値で渡されますが、配列要素を変更できます。オブジェクトは不変Integerであるため、を渡しても役に立たないことに注意してください。Integer

または、2 倍の値を返すようにメソッドを再設計し、呼び出しコードで割り当てることもできます (ナンバリが示唆するように)。

于 2012-09-24T03:51:01.900 に答える
2

配列を渡す戻り値を使用する以外の3番目の可能性はValueHolder、ゲッターとセッターを使用してクラスのオブジェクトを渡すことです。

public class IntValueHolder
{
    private int value;
    public int getValue()
    {
        return this.value;
    }
    public void setValue(final int value)
    {
        this.value = value;
    }
}

これは、技術的には配列を渡すのと非常に似ていますが、IMHOは少しクリーンです。つまり、意図をより適切に記述します。

于 2012-09-24T04:17:12.447 に答える
0

実行できることの1つは、modify()メソッドの戻り値を取得し、それを次のように変数に割り当てることです。

public void start() {
    int x = 100;
    x=modify(x);   
}

public int modify(int y) {
    return y *= 2;
}
于 2012-09-24T04:08:33.243 に答える