Java中的objects是被garbage collector回收的,不是靠程序员人工回收。这是和C++的重大区别之一。

解决方案 »

  1.   

    那又怎么样,你的意思是说不定规什么时候才能真正消失,但文档说只要重新调用show或者pack就能两次显示,这不和所有资源被释放矛盾吗
      

  2.   

    当然不是了
    看你的意思,你把Dialog定义成类的成员了,那么当然不会被回收,除非你在show之后设置为null.
    还有JDialog对象如果不dispose的话,即使设置为null也不会被回收,这是要注意的地方
      

  3.   

    jframe也是一样的
    能把你的代码贴出来看看吗
      

  4.   

    我跟踪了一下程序,第一次打开时是创建这个实例,然后show,第二次的时候,因为实例仍然存在,所以直接就打开了。有没有真正关闭的办法
    --------------------------------------------------
    如果你能在第二次中判断这个instance,那么肯定你的程序中还有指向这个instance的reference,所以该对象不能被回收
      

  5.   

    的确是引用仍然存在,因为它是一个类的实例变量,不是局部,因为这个原因?
    class ProjectButton extends JButton implements ActionListener {
       public ProjectButton(conDB conapp) {
        this.conIns = conapp;

    //设置按钮文字
    setText("项目状况");
    //设置按钮上的图片
    setIcon(new ImageIcon("project.gif"));
    //对"单击"按钮事件监听
           addActionListener(this);
       }  //该类为按钮增添了监听器,当"单击"按钮时触发这段代码
       public void actionPerformed(ActionEvent e) {
    //当"项目记录管理"子界面已经打开了就不创建该子界面,
    //如果该子界面没有打开则创建该子界面并且显示
    if(proRecTable == null) {
        proRecTable = new ProjectRecordTable(conIns);
    proRecTable.show();
        } else {
        proRecTable.show();
    }
       }  //数据库连接类的对象
      private conDB conIns;
      
      //私有变量,"项目记录管理"子界面
      private   ProjectRecordTable proRecTable = null;//它是要打开的窗体}
    如果是实例变量,岂非每次打开都要判断一下是否为null?或者直接声明时就创建实例(不太好,占资源)还是声明为局部变量
      

  6.   

    如果你这么写,那么当然,这个ProjectRecordTable实例创建之后就会一直保存着,因为你的ProjectButton对象还有指向这个实例的应用。如果你想及时回收的话,把proRecTable申明为局部变量,或者在proRecTable.show();加上proRecTable = null;还有要注意的地方,要dispose.