我在同一java文件中有以下代码。

import javax.swing.SwingUtilities;
import java.io.File;

public class MainClass2{
   public static void main(String[] args){
       SwingUtilities.invokeLater(new Runnable(){
             public void run() {
                 javax.swing.JFileChooser jfc = new MyFileChooser();
                     File file = jfc.getSelectedFile();
             }

      });
   }
}

class MyFileChooser extends javax.swing.JFileChooser{
    public MyFileChooser(){
        System.out.println("constructor call");
    }
    @Override
    public java.io.File getSelectedFile(){
        System.out.println("call to getSelectedFile");
        return null;
    }
}

当我运行它时,输出给我
call to getSelectedFileconstructor callcall to getSelectedFile
输出不应该是
constructor callcall to getSelectedFile
我正在使用Java 5。

最佳答案

MyFileChooser的构造函数等效于:

public MyFileChooser() {
    super(); // ***
    System.out.println("constructor call");
}
getSelectedFile()的基类构造函数对MyFileChooser进行了第一次调用,该构造函数在***之前的上面标记为System.out.println("constructor call")的点隐式调用。

这是堆栈跟踪:
MyFileChooser.getSelectedFile() line: 16
AquaFileChooserUI.installComponents(JFileChooser) line: 1436
AquaFileChooserUI.installUI(JComponent) line: 122
MyFileChooser(JComponent).setUI(ComponentUI) line: 670
MyFileChooser(JFileChooser).updateUI() line: 1798
MyFileChooser(JFileChooser).setup(FileSystemView) line: 360
MyFileChooser(JFileChooser).<init>(File, FileSystemView) line: 333
MyFileChooser(JFileChooser).<init>() line: 286
MyFileChooser.<init>() line: 11

10-02 15:19