所以这可能是一个非常简单的问题,我正在过度思考,但如果我做了类似以下的事情:
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,而不是引用?有没有更好的方法呢?我只是让问题复杂化了吗?
我不确定要搜索什么,所以我找不到其他问题来回答我的问题。
提前致谢!
答案 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)
是的,它是同一个实例。它的工作原理如下图所示:
因此,在b.parent.foo上调用一个方法,它在构造函数中传递的同一个实例上调用。