0

したがって、これは私が考えすぎている非常に単純な質問かもしれませんが、次のようなことをすると:

class A{
    public String test_string = "before (default)";
    public A(){
        B b = new B(this);
    }
    public void testA(){
        this.test_string = "after (new)";
    }
}

ここで、B は次のとおりです。

class B{
    private A parent;
    public B(A mParent){
        parent = mParent;
    }
    private void testB(){
        System.out.println(parent.test_string);
    }
}

Aこれにより、 (すべてのパブリック フィールドとメソッド)の同じインスタンスに引き続きアクセスできますか? A.testA()の特定のインスタンスで別のクラスから呼び出した場合ABそのAコンストラクターのtestB関数で構築された は"after (new)"文字列を返しますか? Aまたは、Javaは参照ではなく値で割り当てないため、それはのコピーになりますか? これを行うより良い方法はありますか?私は問題を複雑にしすぎていますか?

何を検索すればよいかわからなかったので、質問に答える他の質問を見つけることができませんでした。

前もって感謝します!

4

2 に答える 2

2

クラスに public フィールドを持ち、それらにアクセスすることは、カプセル化を破っています。アクセサーが必要な場合は、それらをアクセサーでラップしてください。

さらに、「聞かないで伝える」というルールに固執する場合、実際のコードは次のようになります。

private void testB(){
    parent.printTestString();
}

そしてAではあなたが持っているでしょう

public void printTestString(){
    System.out.println(test_string);
}

ご質問への回答として

「それで、A の同じインスタンス (パブリック フィールドとメソッドのすべて) に引き続きアクセスできますか? A のその特定のインスタンスの別の場所にある別のクラスから A.testA() を呼び出した場合」

はい、それが同じインスタンスである場合はそうです。

「その A のコンストラクターの testB 関数で構築された B は、"after (new)" 文字列を返しますか?」

はい、そうです。メンバーフィールドは新しい文字列参照を指すため、 A のそのインスタンスを使用すると同じ値が得られます(スレッドセーフにもかかわらず)

于 2012-06-10T23:40:45.710 に答える
1

はい、同じインスタンスです。次の図に示すように機能します。

ここに画像の説明を入力

したがって、b.parent.foo でメソッドを呼び出すと、コンストラクターで渡された同じインスタンスで呼び出されます。

于 2012-06-10T23:49:42.140 に答える