本文帶你徹底搞懂java類(lèi)的main方法

背景

前兩周候衍,幫一些兄弟解答疑問(wèn)時(shí)。發(fā)現(xiàn)經(jīng)常會(huì)有這種問(wèn)題洒放。為什么我的程序蛉鹿,沒(méi)有打印出東西呀?我仔細(xì)看了半天之后往湿,發(fā)現(xiàn)下面這些情況妖异,是今天這個(gè)主題中,比較常見(jiàn)的錯(cuò)誤领追。

//先來(lái)一個(gè)正確范本
public static void main(String[] args){ ... }


//下面錯(cuò)誤示例他膳,你看看能否找出原因
//錯(cuò)誤1
public static void mian(String[] args){ ... }
//錯(cuò)誤2
public static void main(){ ... }
//錯(cuò)誤3
public void main(String[] args){ ... }

對(duì),我們今天要說(shuō)的就是這個(gè):

public static void main(String[] args){ ... }

正文

main方法是Java程序的入口绒窑,記住棕孙,我們Servlet、及其他任何容器管理的java程序,不在我們本次討論范圍中蟀俊。在java核心編程中钦铺,JVM會(huì)查找類(lèi)中的

public static void main(String[] args){ ... }

如果找不到該方法就拋出錯(cuò)誤NoSuchMethodError:main 程序終止。main方法必須嚴(yán)格遵循它的語(yǔ)法規(guī)則肢预,方法簽名必須是public static void矛洞,參數(shù)是字符串?dāng)?shù)組類(lèi)型。

正確姿勢(shì)

//重要的事情說(shuō)三遍误甚,好像已經(jīng)有三遍了8克Α!窑邦!
public static void main(String[] args){ ... }
//如果是Java1.5及以后的版本還可以使用可變參數(shù):
public static void main(String... args){ ... }

為什么要用public擅威?

Java指定了一些可訪問(wèn)域的修飾符如:

private、protected冈钦、public

任何方法或變量都可以聲明為public郊丛,Java可以從該類(lèi)之外的地方訪問(wèn)。

main方法之所以是public瞧筛,是因?yàn)橐粋€(gè)Java程序在運(yùn)行時(shí)首先創(chuàng)建一個(gè)JVM實(shí)例厉熟。

程序要運(yùn)行需要調(diào)用main方法,JVM從外部調(diào)用main方法這就需要訪問(wèn)權(quán)限修飾符必須給出外部訪問(wèn)的權(quán)限较幌,所以只能用public揍瑟。

擴(kuò)展:

根據(jù)Java語(yǔ)言規(guī)范,main方法必須聲明為public乍炉。在JavaSE1.4以前绢片,當(dāng)main方法不是public時(shí),有些版本的Java解釋器也可以執(zhí)行岛琼。詳見(jiàn)https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4252539底循。當(dāng)時(shí)SUN解釋說(shuō),Java虛擬機(jī)規(guī)范并沒(méi)有要求main方法一定是public槐瑞。

以上只是寫(xiě)出來(lái)熙涤,豐富一下興趣。

為什么要用static困檩?

先看static的作用:在類(lèi)中祠挫,被static修飾符修飾的變量稱(chēng)為靜態(tài)變量(也叫類(lèi)變量),而static修飾的方法則是靜態(tài)方法悼沿,static方法屬于類(lèi)而不是屬于某個(gè)對(duì)象等舔,所以static方法是可以直接通過(guò)類(lèi)名調(diào)用的不必先創(chuàng)建出實(shí)例的。

所以main方法是定義為static,就是為了JVM在調(diào)用main方法時(shí)不用實(shí)例化對(duì)象(new出一個(gè)對(duì)象)显沈,只需要在初始時(shí)加載main方法所在類(lèi),然后直接通過(guò)類(lèi)名.main來(lái)調(diào)用main方法。

擴(kuò)展:

在靜態(tài)方法中拉讯,不能調(diào)用非靜態(tài)方法及非靜態(tài)變量涤浇。但是非靜態(tài)方法,可以調(diào)用靜態(tài)方法及變量魔慷。這是因?yàn)樵陬?lèi)被加載時(shí)只锭,類(lèi)的靜態(tài)部分(靜態(tài)變量、靜態(tài)方法和靜態(tài)塊)首先就分配了內(nèi)存空間并完成初始化操作院尔,當(dāng)非靜態(tài)方法調(diào)用他們的時(shí)候蜻展,他們已經(jīng)有了內(nèi)存空間,所以可以找到邀摆。

為什么要用void纵顾?

void表示main方法沒(méi)有返回值,沒(méi)有返回值的原因是因?yàn)槎绊铮琺ain返回任何值對(duì)程序都沒(méi)任何意義施逾,所以Java程序不需要main方法向操作系統(tǒng)返回退出信息。

為什么要用main例获?

main的名稱(chēng)不能變是為了JVM能夠識(shí)別程序運(yùn)行的起點(diǎn)汉额,main方法可以被重載,重載的main方法不會(huì)被執(zhí)行榨汤。main方法作為程序初始線程的起點(diǎn)蠕搜,任何其他線程均由該線程啟動(dòng)。

為什么要用String[] args收壕?

String[] args,是main方法中唯一可以改變的地方妓灌。args是arguments的縮寫(xiě),只是一個(gè)變量默認(rèn)名啼器,你也修改它旬渠。將它改成其它,任何令你開(kāi)心的名稱(chēng)端壳。

如String[] happy;String[]shige告丢。

String[] args更像是一種擺設(shè),很多初學(xué)者都不知道它的作用损谦,其實(shí)它是程序運(yùn)行傳入的一個(gè)參數(shù)岖免。下面用一個(gè)簡(jiǎn)單例子來(lái)說(shuō)明他的用途。

public class Test {
    public static void main(String... args){
        if(args.length < 2){
            System.out.println("參數(shù)有誤!!!");
            System.exit(0);
        }
        System.out.println("當(dāng)前運(yùn)行程序的人員編號(hào)是:"+args[0]);
        System.out.println("當(dāng)前運(yùn)行程序的人員名稱(chēng)是:"+args[1]);
    }
}

結(jié)果:

輸出結(jié)果

進(jìn)階

JVM是如何調(diào)用main方法照捡,是如何調(diào)用main方法的呢颅湘?

調(diào)用流程圖
具體調(diào)用處的代碼

總結(jié)

main方法是JAVA類(lèi)的入口,它是具有強(qiáng)規(guī)范性的栗精,不能夠隨意更改闯参。之所以瞻鹏,一些新學(xué)JAVA的同學(xué),會(huì)犯上面一開(kāi)始的錯(cuò)誤鹿寨。主要是由于剛才學(xué)新博,還不知道,這個(gè)方法很多地方不能修改脚草。這里同時(shí)赫悄,也給新學(xué)JAVA同學(xué)一些學(xué)習(xí)建議。1.心要細(xì)馏慨。對(duì)著別人的范例代碼敲的時(shí)候埂淮,一定仔細(xì)看清楚,不要抄錯(cuò)了写隶。剛開(kāi)始學(xué)的同學(xué)倔撞,因?yàn)槌隽藛?wèn)題,你是很難找到的樟澜,所以抄代碼一定要仔細(xì)误窖。一開(kāi)始舉的那些例子,仔細(xì)一點(diǎn)的話秩贰,基本可以避免霹俺。2.膽要大。在完成第一步毒费,抄正確之后丙唧,而且還能正確運(yùn)行之后,可以嘗試著觅玻,去改一下代碼想际,試一下自己改了之后會(huì)是什么結(jié)果。這樣會(huì)加深你的代碼的理解溪厘。3.多思考胡本。在寫(xiě)完一段代碼,要多思考它為什么要這樣寫(xiě)畸悬,不可以這樣寫(xiě)侧甫。然后思考,嘗試著模仿重新寫(xiě)一些相似功能的代碼蹋宦。

擴(kuò)展

下面部分披粟,留給兄弟們?nèi)グ俣群蛧L試的內(nèi)容。有疑問(wèn)可以留言討論冷冗。

  • main其實(shí)還是有部分可以修改的守屉,比如可以拋出異步,final蒿辙,synchronized等拇泛。試著修改

  • 方法名一定要是”main“嗎滨巴?有辦法改這個(gè)名稱(chēng)么?如果JAVA不行C++可以么俺叭?

image

PS: 另外兢卵,本人建了個(gè)微信學(xué)習(xí)交流群,禁廣告绪颖、推廣,歡迎大家進(jìn)群交流~

加群方式 - 掃描下方********筆者二維碼

作者微信號(hào)

師哥的公眾號(hào)甜奄,主要分享些程序開(kāi)發(fā)中常用柠横,進(jìn)階的知識(shí)以及日常工作遇到的問(wèn)題,偶爾在水一下職場(chǎng)课兄。歡迎您的關(guān)注和吐槽牍氛。

同時(shí)本公眾號(hào)的內(nèi)容,會(huì)同步本人的個(gè)人網(wǎng)站烟阐。另外網(wǎng)站會(huì)多一些不適合在公眾發(fā)表的內(nèi)容搬俊。

微信號(hào) : wejias_com

新浪微博:程序員偽架師

網(wǎng)站:www.wejias.com

長(zhǎng)按二維碼關(guān)注

作者公眾號(hào):程序員偽架師
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蜒茄,隨后出現(xiàn)的幾起案子唉擂,更是在濱河造成了極大的恐慌,老刑警劉巖檀葛,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玩祟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屿聋,警方通過(guò)查閱死者的電腦和手機(jī)空扎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)润讥,“玉大人转锈,你說(shuō)我怎么就攤上這事〕睿” “怎么了撮慨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)勒魔。 經(jīng)常有香客問(wèn)我甫煞,道長(zhǎng),這世上最難降的妖魔是什么冠绢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任抚吠,我火速辦了婚禮,結(jié)果婚禮上弟胀,老公的妹妹穿的比我還像新娘楷力。我一直安慰自己喊式,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布萧朝。 她就那樣靜靜地躺著岔留,像睡著了一般。 火紅的嫁衣襯著肌膚如雪检柬。 梳的紋絲不亂的頭發(fā)上献联,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音何址,去河邊找鬼里逆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛用爪,可吹牛的內(nèi)容都是我干的原押。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼偎血,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼诸衔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起颇玷,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤笨农,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后帖渠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體磁餐,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年阿弃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诊霹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渣淳,死狀恐怖脾还,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情入愧,我是刑警寧澤鄙漏,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站棺蛛,受9級(jí)特大地震影響怔蚌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜旁赊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一桦踊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧终畅,春花似錦籍胯、人聲如沸竟闪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)炼蛤。三九已至,卻和暖如春蝶涩,著一層夾襖步出監(jiān)牢的瞬間理朋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工绿聘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暗挑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓斜友,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親垃它。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鲜屏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345