0

これが私のコードです

Class A

public class A {
    private int a;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
}

Class Change

public class Change {
    public void changeSomething(A a){
        a.setA(13);
    }
}

Class Learn

public class Learn {
    public static  void main(String[] args) {
        A a = new A();
        Change change = new Change();
        change.changeSomething(a);
        System.out.println(a.getA());
    }
}

出力は13です。オブジェクトをchangeSomethingメソッドに渡すと、内部的にオブジェクトAの値が変更されましたが、なぜその関数の外でこの効果が見られるのですか?

これは、Cで値を渡すことと同じではありません。この場合、その変数/オブジェクトを返さない限り、更新された値は取得されません。

つまりa=changeSomething(a);、このメソッドの戻り型をAに設定する必要はありませんか?

ありがとう

4

4 に答える 4

2

元のオブジェクトへの参照を渡します。メソッドを書くとき

void someMethod(A param) { ... }

param元のオブジェクトへの参照です。元のオブジェクトはコピーされていません。したがって、このオブジェクトを変更すると、そのオブジェクトが観察される場所に変更が表示されます。

あなたが書くとき:

private A a = new A();

変数は実際のオブジェクトタイプではなく、オブジェクトタイプへの参照であることを理解することが重要です。確かに、それは素晴らしい区別です。AA

上記の動作は、システム全体に予期しない影響を与える可能性があります。これは、特に複数のスレッドから変更をトリガーできるスレッド環境では、不変性の主張です。

于 2012-08-16T08:53:51.300 に答える
1

短い:

changeSomething()オブジェクトの値を更新するため、同じインスタンスを参照すると、同じ値が返されます

少し長い説明:

//an Object of A created and its reference is set to a
A a = new A();
//instance of Change is created and its reference is set to change
Change change = new Change();
//it passes reference's (a) 's value to the changeSomething method
//which invokes `setA()` on instance referred by a (which is the same instance that waas crated in line 1

change.changeSomething(a);

//so you will get the changed value here
System.out.println(a.getA());
于 2012-08-16T08:50:20.367 に答える
1

提供したコードは、Aのインスタンスで直接機能します。このインスタンスは、返すかどうかに関係なく変更されます。それでもオブジェクトの同じインスタンスです。そして、このインスタンス変数は新しい値を反映します。

于 2012-08-16T08:51:01.210 に答える
-3

これは、オブジェクトを渡すためであり、Javaのオブジェクトは常に参照によって渡されます。プリミティブ(int、double、char、long ...)のみが値によって渡されます。

Cでは次のようになります。

public void changeSomething(A& a){
 a.setA(13);
}
于 2012-08-16T08:51:18.997 に答える