0

Java の次のコードの違いは何ですか? オブジェクトが Java でどのように渡されるかを明確に把握できませんでした。誰でも以下のコードを説明できますか。

package cc;

public class C {

    public static class Value {
        private String value;

        public void setValue(String str) {
            value=str;
        }

        public String getValue() {
            return value;
        }
    }



    public static void test(Value str) {
        str.setValue("test");
    }

    public static void test2(Value str) {
        str=new Value();
        str.setValue("test2");
    }
    public static void main(String[] args) {
        String m="main";
        Value v=new Value();
        v.setValue(m);
        System.out.println(v.getValue()); // prints main fine
        test(v);
        System.out.println(v.getValue()); // prints 'test' fine
        test2(v);
        System.out.println(v.getValue()); // prints 'test' again after assigning to test2 in function why?
    }
}
4

4 に答える 4

3

新しいインスタンスが作成され、test2()参照が渡されるオブジェクトではなく、新しいインスタンスに値を設定しています

public static void test2(Value str) {
        str=new Value();
        str.setValue("test2");
}

関連項目

于 2012-08-23T06:55:46.047 に答える
1

に渡すとき、実際に行っているのは、 を指す参照のコピーをメソッドに渡すことですv。これ、 と同じ値を持つ新しい変数と考えてください。test2vv

内部に新しいValueオブジェクトを割り当てると、参照のコピーに新しい値が割り当てられます。内部に存在する元の参照は、この再割り当ての影響を受けず、元のオブジェクトを引き続き参照します。strtest2main

printlnで 3 番目を実行すると、 内で作成された新しいオブジェクトではなく、main元のオブジェクトを引き続き使用しているため、表示され、出力されません。Valuetest2testtest2

于 2012-08-23T06:59:53.153 に答える
0

関数test()では、オブジェクトを渡しValue、そのオブジェクトに文字列を設定しています。

 public static void test(Value str) {
    str.setValue("test");
 }

したがって、印刷System.out.println(v.getValue());するとtest、出力として提供されます。

次に、test2()which を呼び出して新しいインスタンスを作成し、新しいインスタンスにValue 値を設定します。しかし、渡されたオブジェクトではないため、新しく作成されたオブジェクトのtest2値は であり、古いオブジェクトの値はまだtestです。

于 2012-08-23T07:04:04.547 に答える
0

Java では、オブジェクトは値渡しされます。v2 の参照を str にコピーします。新しいオブジェクトを作成して str に割り当てますが、str は test2 メソッド スコープ内のローカル変数です。test2 メソッド内の str のみが変更されます。

public static void test2(Value str) {
  str=new Value();
  str.setValue("test2");
  System.out.println(str.getValue());
}
于 2012-08-23T07:01:28.690 に答える