沒有main方法真的不能執行代碼了嗎?


今天看北大慕課遇到一段代碼,於是下載下來跑了一下,奇葩的是,沒有main方法既沒報錯,還出了結果。

下面貼出代碼:

class InitialTest
{
    public static void main(String[] args) 
    {
        new InitialTest2(6);
    }
    int n=10;  //step2
    {
        n++;
        System.out.println("InitialTest..."+n);
    }
    
    static int x;
    static 
    {
        x++;
        System.out.println("static..." +x);
    }
    
}

class InitialTest2 extends InitialTest{
    InitialTest2(int a){ 
        this.a=a; 
        System.out.println("this.a=" + a );
    }
    int a;
    {
        System.out.println("InitialTest2..."+this.a);
    }
    static
    {
        x++;
        System.out.println("static2..." +x);
    }
}
執行:
InitialTest
static...1
static2...2
InitialTest...11
InitialTest2...0
this.a=6

 

執行:

InitialTest2
static...1
static2...2
InitialTest...11
InitialTest2...0
this.a=6

  於是乎查閱很多資料,發現這種解釋相對靠譜:

實際上人家說“Java應用程序必須從main()方法開始運行”這句話千真萬確,不容置疑的。那上面的例子如何解釋呢?
 
原因在於Java虛擬機在執行InitialTest2的時候,首先加載類,然后執行內部的靜態塊,執行完靜態塊后才去調用main方法。
 
可是,在靜態塊中,System.exit(0)已經強制性的讓程序退出了,而根本就沒機會調用main方法。而且,InitialTest2是在靜態塊中輸出的,這就給初學者一個錯覺。
繼續探究,注釋了InitialTest類中main方法那一段,看看還能不能執行;結果在eclipse中不能直接運行了。。。
繼續探究,僅注釋InitialTest類中main方法中new InitialTest2(6)這一句;結果報錯了。。。
錯誤: 在類 InitialTest2 中找不到 main 方法, 請將 main 方法定義為:
   public static void main(String[] args)

 繼續探究,把文件名改成InitialTest2.java(原文件名為InitialTest.java) 直接cmd運行:

C:\Users\ProfessorRen>D:

D:\>javac InitialTest2.java

D:\>java InitialTest2
static...1
static2...2
InitialTest...11
InitialTest2...0
this.a=6

D:\>

  接着上面繼續探究,把main方法那一段注釋,放在cmd下執行,編譯通過,但運行報錯了。。。

吃飯去,有空繼續。。。。。。
參考鏈接:http://lavasoft.blog.51cto.com/62575/106321/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM