直接定义在方法中的变量是方法中的局部变量,书上说,这种变量的生命周期就是直到方法结束,方法结束后,变量就消失了,好像从来没有来到过这个世界上。
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??

解决方案 »

  1.   

    你的JButton b =new JButton("x");
    是局部变量对象引用 ,但是 Frame引用他了 ,所以 不会回收 
      

  2.   

    jbutton b 局部变量指的是它
    但是其实际指向new JButton("x")被其他对象所引用了所以说构造函数完成时,局部变量b已经销毁,但是它所指向的实际对象要等到没有被其他对象引用的时候才会被gc
      

  3.   


    你把 变量 跟 对象 混淆了。
    JButton b =new JButton("x");b 是个变量,new JButton("x") 是个对象。b这个变量的空间,函数结束就可以释放了;但new JButton("x")这个对象所占用的空间是否能释放,要看其有没有被任何其它变量(成员属性)所引用。
      

  4.   

    你的局部变量 在方法结束后销毁了
    Jbutton 对象没有消失?
    所以他会存在!
      

  5.   

    会的,String s = new String("xyz");创建了几个String Object,呵呵
      

  6.   

    你在主方法里new了一个Frame对象,自然调用了 Frame(){
            setVisible(true);
            setSize(300,300);
            JButton b =new JButton("x");
            add(b);
        }
    这个构造方法。你说的局部变量的说法是正确的,但这和出现Button没关心。Button出现就是因为新建对象调用了构造方法。
      

  7.   

    他说的不错,button是对象不是变量,变量有两种一种是int,char,double等等,一种是引用变量。一般变量通常是在栈空间上生存,对象是在堆上。你再去了解一下吧,推荐一本书 《HEAD FIRST JAVA》.
      

  8.   

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