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接受了一个A参数B

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

创建类this对象时,您需要传递对对象的引用: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;    
    }
}

另一种可能性是在类 A 中声明类 B。对于这样的类,在创建封闭类的对象时,对封闭对象的“this”值的引用将自动作为隐藏参数传递:

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

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

请注意,如果您将类声明B为静态,这会将内部类转换B为普通的顶级类,并且this外部类的值将不再执行。

于 2013-03-16T10:40:02.743 回答
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 回答