1

サンプルコード:

public class A {
    B b = new B();
    int a = 17;
}

public class B {
    int getA() {
        // how to get 'a' field from object containing 'this' object 
    }
}

私の質問は、サンプル コードのコメントのとおりです。一般に、「this」オブジェクトを含むオブジェクトからフィールドとメソッドにアクセスする方法。私の例では、クラス B はクラス A のフィールドとしてのみインスタンス化されます。

4

4 に答える 4

2

開始点が のコードである場合B、それはできません。BVM のすべてのクラスで使用されているすべての場所にアクセスして見つける方法はありません。

さらに、それをやりたい場合は、クラス構造を再検討する必要があることを示しています。たとえば、コンストラクターで引数をB受け入れる場合があります。AB

public B(A owner) {
    // ...do something with owner object
}

ただし、これにより、Aとがかなり緊密に結合され、問題になる可能性があります。代わりに、知る必要がある の側面をインターフェイスに抽象化し、そのインターフェイスを実装Bし、そのインターフェイスを使用して型指定された引数を受け入れることができます。ABAB

または、Bについて何も知る必要がないようにしAます。通常はこれが最適です。

于 2013-03-16T10:32:33.703 に答える
1

これを試して:

class A {
    B b = new B(this);
    int a = 17;
}

class B {
    A a;
    public B(A a) {
        this.a=a;
    }
    int getA() {
        return a.a;
    }
}
于 2013-03-16T10:34:05.263 に答える
1

A インスタンスへの参照を保存する必要があります。

public class A {
    B b = new B(this);
    int a = 17;
}

class B {
    public B(A a) {
        this.a = a;
    }

    private final A a;

    int getA() {
        return a.a;
    }
}

... または、Aa が定数として意図されている場合は、次のように宣言します。

public class A {
    B b = new B(this);
    public static final int a = 17;
}

class B {    
    int getA() {
        return A.a; // but then you could use A.a at the call site anyway
    }
}

どちらが最適かは、解決しようとしている実際の問題によって異なります。さらにアドバイスが必要な場合は、実際のコードを投稿してください。

于 2013-03-16T10:42:57.713 に答える
1

class のオブジェクトを作成するときは、 thisof オブジェクトへの参照を渡す必要があります。AB

public class A {
    B b = new B(this);
    int a = 17;
}

public class B {
    A mA = null;
    public B(A pA) { mA = pA; }
    int getA() {
        int a2 = mA.a;    
    }
}

もう 1 つの可能性は、クラス A 内でクラス B を宣言することです。このようなクラスの場合、囲んでいるオブジェクトの「this」の値への参照は、囲まれたクラスのオブジェクトを作成するときに隠しパラメーターとして自動的に渡されます。

public class A {
    B b = new B();
    int a = 17;

  public class B {
    int getA() {
       int a2 = A.this.a;
    }
  }
}

Bクラスを static として宣言すると、内部クラスBが通常の最上位クラスとして変換さthisれ、外部クラスの値が処理されなくなることに注意してください。

于 2013-03-16T10:40:02.743 に答える