日期:2014-05-20  浏览次数:20588 次

关于局部变量的问题
直接定义在方法中的变量是方法中的局部变量,书上说,这种变量的生命周期就是直到方法结束,方法结束后,变量就消失了,好像从来没有来到过这个世界上。

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是定义在构造方法里的,应该是构造方法一结束,它就消失了才对,可是为什么,我运行程序显示出来的窗口里,有button??

------解决方案--------------------
你的局部变量 在方法结束后销毁了
Jbutton 对象没有消失?
所以他会存在!
------解决方案--------------------
你在主方法里new了一个Frame对象,自然调用了 Frame(){
setVisible(true);
setSize(300,300);
JButton b =new JButton("x");
add(b);
}
这个构造方法。你说的局部变量的说法是正确的,但这和出现Button没关心。Button出现就是因为新建对象调用了构造方法。
------解决方案--------------------
探讨

引用:
问题:上面这段代码,我的JButton是定义在构造方法里的,应该是构造方法一结束,它就消失了才对,可是为什么,我运行程序显示出来的窗口里,有button??


你把 变量 跟 对象 混淆了。
JButton b =new JButton("x");

b 是个变量,new JButton("x") 是个对象。

b这个变量的空间,函数结束就可以释放了;但……

------解决方案--------------------
add(b),把JButton对象的实例添加到了JFrame(就是相当于this的)对象了,b是局部变量,出了构造函数它不存在了,但是JFrame中还有刚才创建的JButton对象的引用。