我不明白我们如何使用相同的JLabel变量来创建新标签。这里的aLabel变量不是指同一个对象(标签)。那我们怎么能得到4个标签?
我可以使用其他类对象或仅使用组件类来执行此行为吗?
这里逐步执行代码流程的说明会很有帮助。
JLabel label1 =newJLabel("First label");
add(label1, BorderLayout.NORTH);
JLabel label2 =newJLabel("Second label");
add(label2, BorderLayout.SOUTH);
JLabel label3 =newJLabel("Third label");
add(label3, BorderLayout.CENTER);
或者我可以使用:
JLabel aLabel =newJLabel("First label");
add(aLabel, BorderLayout.NORTH);
aLabel =newJLabel("Second label");
add(aLabel, BorderLayout.SOUTH);
aLabel =newJLabel("Third label");
add(aLabel, BorderLayout.CENTER);
答案 0 :(得分:1)
在这种情况下,aLabel只是对内存中对象的引用。当你这样做时:
aLabel = newJLabel("Second label");
您正在更改引用以指向与第一个标签完全不同的对象。基本上这就是"把这个东西放在等式的右边,让一个标签指向它。"然后,当你打电话
add(aLabel, BorderLayout.SOUTH);
实际上,您添加的对象与第一次调用时完全不同。
在另一种情况下,您只需为每个对象创建一个新的引用。
答案 1 :(得分:1)
你需要记住,当标签对象被添加时,它会保留对标签对象的引用 - 它不会被遗忘"供你重复使用。在第二种情况下,您只是更改同一标签的名称并将其添加到用户界面中的多个位置 - 但是当您更改标签的文字时,您需要更改您已在UI中的其他位置添加的完全相同的对象。
理论上你可以安全地重用JLabel
s,但只有当没有其他东西(包括UI)拥有对它的引用时。在实践中,不要打扰 - 它会产生混乱,容易出错的代码。如果你想在某个地方买一个新标签,只需创建一个新的标签对象,让GC清除任何未使用的旧标签。
答案 2 :(得分:1)
更好的是,为什么不呢?
add(new JLabel("First label"), BorderLayout.NORTH);
add(new JLabel("Second label"), BorderLayout.SOUTH);
add(new JLabel("Third label"), BorderLayout.CENTER);
当然,如果您需要引用该JLabel,那么您将失去运气(因为您未能在对象中保留引用)。
这是许多JLabel变量的真正动力,他们希望保留对每个创建的JLabel的引用。也许那些参考文献并没有被用于任何特定的目的,但许多人创造它们并且#34;以防万一"他们将来需要一个JLabel的句柄。
在某些时候,你需要减少损失,然后继续使用它。也许重要的是以这种方式进行优化,也许不是。如果它很重要,那么您通常会编写一些代码来证明性能的提高。如果您没有编写该代码,那么您无法证明自己做得更好。
有趣的是,在编写代码来跟踪您关注的性能类型时,您很快发现代码的许多方面都存在一些性能影响问题无关紧要;因为它们很少被使用,导致很少感受到影响,或者它们被更大的问题所掩盖。
在不进行某种分析的情况下进行更改有时可以提供解决方案,但通常它只是一种黑暗的方法,类似于过早优化。