正确访问父方法和变量?

时间:2012-06-10 23:36:21

标签: java reference

所以这可能是一个非常简单的问题,我正在过度思考,但如果我做了类似以下的事情:

class A{
    public String test_string = "before (default)";
    public A(){
        B b = new B(this);
    }
    public void testA(){
        this.test_string = "after (new)";
    }
}

其中B是:

class B{
    private A parent;
    public B(A mParent){
        parent = mParent;
    }
    private void testB(){
        System.out.println(parent.test_string);
    }
}

这是否允许我仍然访问A(所有公共字段和方法)的同一个实例?如果我在A.testA()的特定实例上的其他位置调用A,那么B构造函数的A函数中构造的testB是否会"after (new)"返回A字符串?或者那是{{1}}的副本,因为不是按值分配java,而不是引用?有没有更好的方法呢?我只是让问题复杂化了吗?

我不确定要搜索什么,所以我找不到其他问题来回答我的问题。

提前致谢!

2 个答案:

答案 0 :(得分:2)

打破封装以在类中拥有公共字段并访问它们。如果必须,请将它们包装在存取器中。

此外,如果您遵守“告诉不要问”规则,那么实际上您的代码将是:

private void testB(){
    parent.printTestString();
}

在A中你有

public void printTestString(){
    System.out.println(test_string);
}

回答你的问题

“这是否允许我仍然访问A的相同实例(所有公共字段和方法)?如果我在另一个类别A的另一个类上调用A.testA()

是的,如果它是同一个实例的话。

“在A的构造函数的testB函数中构造的B会返回”after(new)“字符串吗?”

是的,成员字段将指向新的字符串引用,因此对该A实例的任何使用都将获得相同的值(尽管为线程安全)

答案 1 :(得分:1)

是的,它是同一个实例。它的工作原理如下图所示:

enter image description here

因此,在b.parent.foo上调用一个方法,它在构造函数中传递的同一个实例上调用。