示例代码:
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 类中的字段实例化。
如果您的出发点是 中的代码B
,那么您不能这样做。没有办法找到并找到B
VM 中所有类中使用的任何地方。
此外,如果您发现自己想要这样做,则表明您需要重新审视您的班级结构。例如,您可能在构造函数中B
接受了一个A
参数B
:
public B(A owner) {
// ...do something with owner object
}
但是,这会在A
和之间引入相当紧密的耦合,这可能是一个问题。相反,您可以将需要了解B
的方面抽象到接口中,实现该接口,并接受使用该接口键入的参数。A
B
A
B
或者避免需要B
了解有关 的任何信息A
,这通常是最好的。
试试这个:
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;
}
}
创建类this
对象时,您需要传递对对象的引用:A
B
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
外部类的值将不再执行。
您必须存储对 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
}
}
哪个最适合您取决于您要解决的实际问题。您应该发布您的真实代码以获得进一步的建议。