访问包含“this”对象的对象的字段和方法

时间:2013-03-16 10:30:55

标签: java contain

示例代码:

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 个答案:

答案 0 :(得分:2)

如果您的起点是B中的代码,那么您就无法做到。没有办法伸手可及地找到虚拟机中所有类都使用B的地方。

此外,如果您发现自己想要这样做,则表明您需要重新审视您的班级结构。例如,您可能BA构造函数中接受B参数:

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

这引入了AB之间相当紧密的耦合,这可能是一个问题。您可能会将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
    }
}

无论哪种方式最适合您,取决于您尝试解决的实际问题。您应该发布您的真实代码以获得进一步的建议。