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