将变量初始化为对现有对象的引用

时间:2012-07-17 21:15:49

标签: java swing

这似乎是一个非常初学的问题,但我不知道答案。

假设您在Java中创建了一个新的JFrame。随着新框架出现默认内容窗格。如果我声明一个变量并将其初始化为该框架的内容窗格,那么该变量是否初始化了对框架内容窗格的引用,或者它是否成为它自己的东西?例如:

JFrame frame = new JFrame();
Container panel = frame.getContentPane();

例如,如果我想更改内容窗格的布局,调整panel会产生与更改frame.getContentPane()相同的效果吗?

准确显示我的意思:

frame.getContentPane().setLayout(new GridLayout());

这会产生与以下相同的结果:

panel.setLayout(new GridLayout());

然后我对panel所做的任何事情都会反映在frame中,而我最后不得不说frame.setContentPane(panel);吗?

4 个答案:

答案 0 :(得分:1)

是。内存中的对象可以有多个引用,任何对象的任何更改都将反映在所有引用上(因为它们都指向同一个对象)。有关详细信息,请参阅this example

答案 1 :(得分:1)

绝对。它们指向内存中的同一个对象。

想象一下,将两根琴弦绑在一个气球上。你拿一个(让我们给你panel打电话)然后你把另一个字符串给朋友(让他们叫他frame.getContentPane())。

现在,如果你的朋友跟着他的字符串,找到气球,并在上面戴上帽子(即frame.getContentPane().setLayout(new GridLayout());),那么当你按照你的字符串时,你会发现一个带帽子的气球!

答案 2 :(得分:0)

是的,他们引用相同的Container对象。

换句话说,getContentPane()会返回对基础Container的引用。因此,无论何时使用引用,都会使用/影响基础对象。

答案 3 :(得分:0)

您的代码

JFrame frame = new JFrame();
Container panel = frame.getContentPane();

确实让变量panel指向框架的内容窗格。所以打电话

panel.setLayout( new GridLayout() );

会影响内容窗格的布局,因为panel引用它。

然而,一个常见的错误是假设你做了像

这样的事情
JFrame frame = new JFrame();
Container panel = frame.getContentPane();
//... some more code

JPanel someOtherFancyPanel = ...;
panel = someOtherFancyPanel;

JFrame的内容窗格将变为someOtherFancyPanel。当然不是这种情况。最后一个语句只是让panel变量指向someOtherFancyPanel而不再指向框架的内容窗格,并且不会更改内容窗格。