Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JLabel变量重用?_Java_Variables_Jlabel - Fatal编程技术网

Java JLabel变量重用?

Java JLabel变量重用?,java,variables,jlabel,Java,Variables,Jlabel,我不知道;我不明白如何使用同一个JLabel变量来创建新标签。这里的aLabel变量不引用同一个对象(标签)。那么我们怎么才能得到4个标签呢 我可以对其他类对象执行此操作,还是仅对组件类执行此操作 在这里解释代码的逐步执行流程会很有帮助 JLabel label1 =newJLabel("First label"); add(label1, BorderLayout.NORTH); JLabel label2 =newJLabel("Second label"); add(label2,

我不知道;我不明白如何使用同一个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);

在本例中,aLabel只是对内存中对象的引用。当您这样做时:

aLabel = newJLabel("Second label");
将参照更改为指向与第一个标签完全不同的对象。这句话的基本意思是“把等式右边的东西拿出来,让阿拉贝尔指着它。”然后,当你打电话时

add(aLabel, BorderLayout.SOUTH);
实际上,您添加的对象与第一次调用时完全不同


在另一种情况下,您只需为每个对象创建一个新的引用。

您需要记住,添加标签对象时,UI会保存一个对该对象的引用,而不仅仅是“忘记”了该对象,以便在以后重新使用。在第二种情况下,您只是更改同一标签的名称并将其添加到UI中的多个位置,但当您更改标签的文本时,您正在更改与您在UI中其他位置添加的对象完全相同的对象

从理论上讲,您可以安全地重用
JLabel
s,但前提是其他任何东西(包括UI)都没有对它的引用。在实践中,不必麻烦-它会创建混乱的、容易出现错误的代码。如果您想在某个地方创建一个新标签,只需创建一个新标签对象,并让GC清除所有未使用的旧标签。

更好的是,为什么不呢

    add(new JLabel("First label"), BorderLayout.NORTH); 
    add(new JLabel("Second label"), BorderLayout.SOUTH); 
    add(new JLabel("Third label"), BorderLayout.CENTER);
当然,如果您曾经需要对该JLabel的引用,那么您就不走运了(因为您没有在对象中保存引用)

这是许多JLabel变量的真正动机,它们希望保存对每个创建的JLabel的引用。也许这些引用没有被用于任何特定的目的,但许多人创建它们“以防万一”,以防将来需要某个jlabel的句柄

在某个时刻,你需要减少你的损失并继续下去。也许以这种方式进行优化很重要,也许不是。如果这很重要,那么您通常会编写一些代码来证明改进的性能。如果你没有写那段代码,那么你就无法证明你做得更好

有趣的是,在编写跟踪您所关心的性能的代码时,您很快就会发现代码的许多方面都存在一些影响性能的问题,这些问题都是不相关的;因为它们很少被使用,导致很少感受到影响,或者它们被更大的问题所掩盖


不进行某种分析而进行更改有时可以提供解决方案,但通常这只是一种暗中操作,类似于过早优化。

在这种情况下,是
new
关键字为对象分配了一些内存位置,并将此引用传递给左侧变量。在这种情况下,您只需使用此引用告知布局将此对象放置在何处,然后再次使用
new
更改此变量的内容将放置另一个值,同样,整个过程将再次重复。第二种方法,使代码的“读者/维护者”更加清晰,IMHO@nIcEcOW-由于aLabel不再引用第一个对象,而是将其引用到第二个标签对象NAA,因此现在
LayoutManager
保留了对该对象的引用,因此,是否应删除由aLabel引用的第一个对象,所以至少在某个地方有人拿着那个参考资料。所以它不会被破坏。这和我试图回应的一个非常相似,是为了某个人。可能这对这个场景也有帮助,我希望:-)是否应该删除由aLabel引用的第一个对象,因为aLabel不再引用它,而是将它引用到第二个label对象–@mhrzn否,因为自从调用add(aLabel,BorderLayout.SOUTH)后,JPanel现在保留了对它的引用。如果我们没有进行该调用,那么对象将被垃圾收集器自动销毁。