0

所以这可能是一个非常简单的问题,我想太多了,但如果我执行以下操作:

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()在 的特定实例的其他地方从另一个类调用AB在那个A构造函数的testB函数中构造的那个会返回"after (new)"字符串吗?或者那是A因为java不是按值分配而不是引用的副本?有没有更好的方法来做到这一点?我只是把问题复杂化了吗?

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

提前致谢!

4

2 回答 2

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 实例的任何使用都将获得相同的值(尽管线程安全)

于 2012-06-10T23:40:45.710 回答
1

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

在此处输入图像描述

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

于 2012-06-10T23:49:42.140 回答