1

Javaで遊んでいる間。オブジェクトが変更されて値が与えられた場合と、新しいオブジェクトが割り当てられた場合に別の値が与えられた場合、異なる動作が見られました。結果を表示するために作成したコードを次に示します。

public class Test {

    int i;

    public Test(int j) {
        this.i = j;
    }

    public static void main(String[] args) {

        Test A = new Test(5);
        Test N = new Test(5);
        add(A);
        makeNew(N);
        System.out.println("Value of A.i= "+A.i);
        System.out.println("Value of N.i= "+N.i);

    }

    private static void add(Test t) {
        t.i+= 3;
        System.out.println("Inside method add() t.i= "+t.i);

    }

    private static void makeNew(Test t) {

        t = new Test(8);
        System.out.println("Inside method makeNew() t.i= "+t.i);

    }

}

上記のコードの出力は次のとおりです。

Inside method add() t.i= 8
Inside method makeNew() t.i= 8
Value of A.i= 8
Value of N.i= 5  

上記の例では、オブジェクト A は値 8 に変更されます。また、オブジェクト B には新しいオブジェクト自体が与えられます。しかし、オブジェクト A だけを呼び戻すと、新しい価値が示されます。オブジェクト B は古い値そのものを示しています。どちらの場合も参照渡しであるため、同じ値を表示するべきではありませんか? Ai と Ni に同じ値を期待していました

4

6 に答える 6

3

何が起こるかは次のとおりです。

Test A = new Test(5);
Test N = new Test(5);

ここに画像の説明を入力

add(A);  // method is add(Test t)

ここに画像の説明を入力

makeNew(N)// method is makeNew(Test t)

ここに画像の説明を入力

t = new Test(8);

ここに画像の説明を入力

System.out.println("Value of A.i= "+A.i);
System.out.println("Value of N.i= "+N.i);

ここに画像の説明を入力

于 2013-05-19T09:13:58.433 に答える
1

変数をオブジェクトと等しくし、後でそのオブジェクトに対して別の参照などの別の場所で new を使用すると、オブジェクト参照に設定した変数は、新しいオブジェクトが何であるかを指しなくなりますが、古いオブジェクトを保持します。したがって、異なるスコープの複数の変数が参照を保持している場合、すべての変数を新しいオブジェクトと同じにする方法が必要です。そうしないと、それらが同期しなくなります。

于 2013-05-19T08:58:04.083 に答える
1

ではmakeNew、既存のオブジェクトへの参照 (パラメーターとして渡される) をオブジェクトで上書きしていnew test(8)ます。ただし、それは内部のローカルであるため、内部makeNewにある元のオブジェクトmain(...)は影響を受けません。

于 2013-05-19T08:54:14.463 に答える
1

これにより、疑いが明確になると思います。

makeNew 内の t を別のオブジェクトに代入する前に

t を新しいオブジェクトに割り当てた後

Nまだ最初のオブジェクトを指しているのがわかります

于 2013-05-19T09:00:58.407 に答える
0

Java は値渡しです。オブジェクトの参照を値として渡すと、そのオブジェクトを変更できます。ただし、オブジェクトの実際の参照を変更して、別のものを指すようにすることはできません。

あなたの質問はすでにここで回答されています: Java は「参照渡し」または「値渡し」ですか?

于 2013-05-19T08:54:12.443 に答える
-1

Java では、実際のオブジェクトを渡すことも、オブジェクトへの参照を渡すこともありません。そのオブジェクトへの参照のコピーを渡します。今あなたが言うとき

makeNew(N);

への参照である N はnew Test(5)渡されませんが、その参照のコピーが渡されます。makeNew() 関数では、このコピーは何らかの新しいオブジェクトを指し、値を適切に出力しますが、N は依然として元のオブジェクトを指します。

于 2013-05-19T09:02:18.717 に答える