这似乎是一个非常初学的问题,但我不知道答案。
假设您在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);
吗?
答案 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
而不再指向框架的内容窗格,并且不会更改内容窗格。