直接定义在方法中的变量是方法中的局部变量,书上说,这种变量的生命周期就是直到方法结束,方法结束后,变量就消失了,好像从来没有来到过这个世界上。
- Java code
import javax.swing.*;public class Test { public static void main(String[] args) { new Frame(); }}class Frame extends JFrame{ Frame(){ setVisible(true); setSize(300,300); JButton b =new JButton("x"); add(b); }}
问题:上面这段代码,我的JButton是定义在构造方法里的,应该是构造方法一结束,它就消失了才对,可是为什么,我运行程序显示出来的窗口里,有button??
------解决方案--------------------
你的JButton b =new JButton("x");
是局部变量对象引用 ,但是 Frame引用他了 ,所以 不会回收
------解决方案--------------------
jbutton b 局部变量指的是它
但是其实际指向new JButton("x")被其他对象所引用了
所以说构造函数完成时,局部变量b已经销毁,但是它所指向的实际对象要等到没有被其他对象引用的时候才会被gc
------解决方案--------------------
------解决方案--------------------
你的局部变量 在方法结束后销毁了
Jbutton 对象没有消失?
所以他会存在!
------解决方案--------------------
你在主方法里new了一个Frame对象,自然调用了 Frame(){
setVisible(true);
setSize(300,300);
JButton b =new JButton("x");
add(b);
}
这个构造方法。你说的局部变量的说法是正确的,但这和出现Button没关心。Button出现就是因为新建对象调用了构造方法。
------解决方案--------------------
------解决方案--------------------
add(b),把JButton对象的实例添加到了JFrame(就是相当于this的)对象了,b是局部变量,出了构造函数它不存在了,但是JFrame中还有刚才创建的JButton对象的引用。