今天看北大慕課遇到一段代碼,於是下載下來跑了一下,奇葩的是,沒有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/
相關推薦
'Python成高收入國家增長最快語言,你動心了嗎?'
"根據Stack Overflow流量分析了Python及其他一些編程語言的發展情況,同時也對高收入國家與非高收入國家的情況進行了對比。我們最近的研究表明,富裕國家(世界銀行定義為高收入國家)喜歡研究的技術與其他國家的不同。其中,我們看到最大的差異是Python語言。當我們...
'面試季馬上就要到了,數據結構和算法你都掌握了嗎'
"什麼是數據結構?簡單說,數據結構就是一個容器,以某種特定的佈局存儲數據。這個“佈局”使得數據結構在某些操作上非常高效,在另一些操作上則不那麼高效。你的目標就是理解數據結構,這樣就能為手頭的問題選擇最優的數據結構。為什麼我們需要數據結構?由於數據結構用來以有組織的形式存儲數...
'盤點10大影響力編程語言,你學對了嗎?'
"在這個“弱肉強食”的社會,世間萬物的發展都逃不開“物競天擇,適者生存”的命運。在IT界編程語言排行榜時時刻刻都在變,每天都有新語言出現,也有老語言沒落。而我們從來都是“只聞新人笑,哪見舊人哭”。再回首,“它”已不見……編程語言(programming language),...
'想做程序員?看了這五種編程入門方法,學習和玩耍一樣'
"程序員要精通一門語言,還是要掌握多門語言?對於這個問題,公說公有理,婆說婆有理。技術更新太快,精通一門編程語言已經實屬不易,又怎麼好意思說精通多門語言呢?不過呢,當你精通一門語言同時,涉獵一下其他語言無傷大雅。這對於編程思想也是大有裨益的。每門設計語言都有其獨特的設計思想...
'一道號稱“史上最難”java面試題引發的線程安全思考,掌握了嗎?'
"最近偶然間看見一道名為史上最難的java面試題,這個題讓了我對線程安全的有了一些新的思考,給大家分享一下這個題吧:public class TestSync2 implements Runnable {int b = 100;synchronized void m1() ...
'你還不知道嗎?靠轉型大數據漲薪的日子已經一去不復返了'
"前言前兩天我和朋友突然聊起這個話題,經過一番討論還是想寫下自己的觀點,其實我個人認為大數據還是值得轉型的,但是想著只靠一個技能翻身的機會沒了在 2013 年,大數據剛剛嶄露頭角,有一大批程序員,在那個時間點,踏上了靠轉型大數據升職加薪的日子。在那個時候,只要稍微懂一點點 ...
'你真的知道註冊中心原理嗎?不妨先來學習一下 ZooKeeper'
"原文: http://www.justdojava.com/2019/08/10/zk-baisic-knowledge/主題 :ZooKeeperDubbo 通過註冊中心在分佈式環境中實現服務的註冊與發現,而註冊中心通常採用 ZooKeeper,研究註冊中心相關源碼繞不...
推薦中...