main函数如下public static void main(String[] args) {
final JFrame jf = new JFrame();
jf.setSize(300, 200);
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
jf.setContentPane(panel);

final String str = new String("string instance");  // str应该算是局部变量吧

JButton btn = new JButton("printStr");
panel.add(btn);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
System.gc();             //10行   垃圾回收
System.out.println(str);  //11行  还能打印出“string instance”, 我的理解应为null;
}

});

SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}

});

System.out.println(str); // 这个打印没问题

}// 这个地方主线程退出,我的理解,主线程退出了,str所指的内存应为成为垃圾,所以第10行回收了,
 // 第11行应该打印为空才对. 我知道我的理解不对,但我想知道为什么?如果按我的理解,那主线程退出了
 // jf 也应该变成内存垃圾了,但实事上不这是这样的,请大家看看,帮小弟解决这个疑惑,不胜感激!!