本文帶你徹底搞懂java類的main方法

背景

前兩周,幫一些兄弟解答疑問時。發(fā)現(xiàn)經(jīng)常會有這種問題。為什么我的程序,沒有打印出東西呀?我仔細看了半天之后,發(fā)現(xiàn)下面這些情況,是今天這個主題中,比較常見的錯誤。

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


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

對,我們今天要說的就是這個:

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

正文

main方法是Java程序的入口,記住,我們Servlet、及其他任何容器管理的java程序,不在我們本次討論范圍中。在java核心編程中,JVM會查找類中的

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

如果找不到該方法就拋出錯誤NoSuchMethodError:main 程序終止。main方法必須嚴格遵循它的語法規(guī)則,方法簽名必須是public static void,參數(shù)是字符串數(shù)組類型。

正確姿勢

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

為什么要用public?

Java指定了一些可訪問域的修飾符如:

private、protected、public

任何方法或變量都可以聲明為public,Java可以從該類之外的地方訪問。

main方法之所以是public,是因為一個Java程序在運行時首先創(chuàng)建一個JVM實例。

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

擴展:

根據(jù)Java語言規(guī)范,main方法必須聲明為public。在JavaSE1.4以前,當main方法不是public時,有些版本的Java解釋器也可以執(zhí)行。詳見https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4252539。當時SUN解釋說,Java虛擬機規(guī)范并沒有要求main方法一定是public。

以上只是寫出來,豐富一下興趣。

為什么要用static?

先看static的作用:在類中,被static修飾符修飾的變量稱為靜態(tài)變量(也叫類變量),而static修飾的方法則是靜態(tài)方法,static方法屬于類而不是屬于某個對象,所以static方法是可以直接通過類名調(diào)用的不必先創(chuàng)建出實例的。

所以main方法是定義為static,就是為了JVM在調(diào)用main方法時不用實例化對象(new出一個對象),只需要在初始時加載main方法所在類,然后直接通過類名.main來調(diào)用main方法。

擴展:

在靜態(tài)方法中,不能調(diào)用非靜態(tài)方法及非靜態(tài)變量。但是非靜態(tài)方法,可以調(diào)用靜態(tài)方法及變量。這是因為在類被加載時,類的靜態(tài)部分(靜態(tài)變量、靜態(tài)方法和靜態(tài)塊)首先就分配了內(nèi)存空間并完成初始化操作,當非靜態(tài)方法調(diào)用他們的時候,他們已經(jīng)有了內(nèi)存空間,所以可以找到。

為什么要用void?

void表示main方法沒有返回值,沒有返回值的原因是因為,main返回任何值對程序都沒任何意義,所以Java程序不需要main方法向操作系統(tǒng)返回退出信息。

為什么要用main?

main的名稱不能變是為了JVM能夠識別程序運行的起點,main方法可以被重載,重載的main方法不會被執(zhí)行。main方法作為程序初始線程的起點,任何其他線程均由該線程啟動。

為什么要用String[] args?

String[] args,是main方法中唯一可以改變的地方。args是arguments的縮寫,只是一個變量默認名,你也修改它。將它改成其它,任何令你開心的名稱。

如String[] happy;String[]shige。

String[] args更像是一種擺設(shè),很多初學(xué)者都不知道它的作用,其實它是程序運行傳入的一個參數(shù)。下面用一個簡單例子來說明他的用途。

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

結(jié)果:

輸出結(jié)果

進階

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

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

總結(jié)

main方法是JAVA類的入口,它是具有強規(guī)范性的,不能夠隨意更改。之所以,一些新學(xué)JAVA的同學(xué),會犯上面一開始的錯誤。主要是由于剛才學(xué),還不知道,這個方法很多地方不能修改。這里同時,也給新學(xué)JAVA同學(xué)一些學(xué)習(xí)建議。1.心要細。對著別人的范例代碼敲的時候,一定仔細看清楚,不要抄錯了。剛開始學(xué)的同學(xué),因為出了問題,你是很難找到的,所以抄代碼一定要仔細。一開始舉的那些例子,仔細一點的話,基本可以避免。2.膽要大。在完成第一步,抄正確之后,而且還能正確運行之后,可以嘗試著,去改一下代碼,試一下自己改了之后會是什么結(jié)果。這樣會加深你的代碼的理解。3.多思考。在寫完一段代碼,要多思考它為什么要這樣寫,不可以這樣寫。然后思考,嘗試著模仿重新寫一些相似功能的代碼。

擴展

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

  • main其實還是有部分可以修改的,比如可以拋出異步,final,synchronized等。試著修改

  • 方法名一定要是”main“嗎?有辦法改這個名稱么?如果JAVA不行C++可以么?

image

PS: 另外,本人建了個微信學(xué)習(xí)交流群,禁廣告、推廣,歡迎大家進群交流~

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

作者微信號

師哥的公眾號,主要分享些程序開發(fā)中常用,進階的知識以及日常工作遇到的問題,偶爾在水一下職場。歡迎您的關(guān)注和吐槽。

同時本公眾號的內(nèi)容,會同步本人的個人網(wǎng)站。另外網(wǎng)站會多一些不適合在公眾發(fā)表的內(nèi)容。

微信號 : wejias_com

新浪微博:程序員偽架師

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

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

作者公眾號:程序員偽架師
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容