背景
前兩周候衍,幫一些兄弟解答疑問(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é)果:
進(jìn)階
JVM是如何調(diào)用main方法照捡,是如何調(diào)用main方法的呢颅湘?
總結(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++可以么俺叭?
PS: 另外兢卵,本人建了個(gè)微信學(xué)習(xí)交流群,禁廣告绪颖、推廣,歡迎大家進(jìn)群交流~
加群方式 - 掃描下方********筆者二維碼
師哥的公眾號(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)注