示例代码:
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类中的字段。
答案 0 :(得分:2)
如果您的起点是B
中的代码,那么您就无法做到。没有办法伸手可及地找到虚拟机中所有类都使用B
的地方。
此外,如果您发现自己想要这样做,则表明您需要重新审视您的班级结构。例如,您可能B
在A
构造函数中接受B
参数:
public B(A owner) {
// ...do something with owner object
}
这引入了A
和B
之间相当紧密的耦合,这可能是一个问题。您可能会将A
需要了解的B
方面抽象为接口,让A
实现该接口,并让B
接受使用该类型键入的参数接口
或者避免让B
了解A
,这通常是最好的。
答案 1 :(得分: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;
}
}
答案 2 :(得分:1)
创建类this
的对象时,需要传递对象A
的引用:
B
另一种可能性是在类A中声明类B.对于这样的类,在创建封闭类的对象时,对封闭对象的“this”的值的引用将自动作为隐藏参数传递:
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;
}
}
请注意,如果将类public class A {
B b = new B();
int a = 17;
public class B {
int getA() {
int a2 = A.this.a;
}
}
}
声明为静态,则会将内部类B
转换为普通的顶级类,并将外部类的B
值转换为将不再完成。
答案 3 :(得分: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;
}
}
...或者如果A.a是一个常数,请将其声明为:
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
}
}
无论哪种方式最适合您,取决于您尝试解决的实际问题。您应该发布您的真实代码以获得进一步的建议。