2013-03-16 61 views
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类中的字段实例化。

回答

2

如果您的出发点是B中的代码,那么您不能这样做。没有办法联系到并找到B在虚拟机中的所有类中都使用。

此外,如果您发现自己想要这样做,则表示您需要重新访问您的班级结构。例如,你可能有BB构造接受A说法:

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

,介绍AB之间相当紧耦合的,虽然,这可能是一个问题。您可能会将需要了解的A方面摘录到接口中,让A实现该接口,并使B接受使用该接口键入的参数。

或避免需要有B知道A,通常是最好的。

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; 
    } 
} 
1

创建B类的对象时,您需要传递给目标Athis参考:

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;  
    } 
} 

另一个可能性是在B中声明B类类A.对于这样的一类,它的值的基准“这个”的创建封闭的类的对象时,包围对象将自动作为隐藏参数传递:

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

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

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

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 
    } 
} 

哪种效果最好对你而言,取决于你正试图解决的实际问题。你应该发布你的真实代码以获得进一步的建议