Java程序入口:main()方法講解


Java程序的入口---main()方法的簽名為:public static void main(String[] args) {...} ,其中,

public修飾符:Java類由JVM調用,為了讓JVM可以自由調用這個main()方法,所以使用public修飾符把這個方法暴露出來。

static修飾符:JVM調用這個主方法時,不會先創建該主類的對象,然后通過對象來調用該主方法。JVM直接通過該類來調用主方法,因此使用static修飾該主方法。

♦ void返回值:因為主方法被JVM調用,該方法的返回值將返回給JVM,這沒有任何意義,因此main()方法沒有返回值。

上面方法中還包括一個字符串數組形參String[] args,根據方法調用的規則:誰調用方法,誰負責為形參賦值。也就是說,main()方法由JVM調用,即args形參應該由JVM負責賦值。但JVM怎么知道為args數組賦值呢?先看下面程序:

public class ArgsTest{

  public static void main(String[] args){

    //輸出args數組的長度

    System.out.println(args.length);

    //遍歷args數組的每一個元素

    for(String arg : args){

      System.out.println(arg);

    }

  }

}

上面程序是最簡單的“hello world”程序,只是這個程序增加了輸出args數組的長度,遍歷arg數組元素的代碼。使用java ArgsTest命令運行上面的程序,看到程序僅僅輸出一個0,這表明args數值是一個長度為0的數組,這是合理的,因為計算機是沒有思考能力的,它只能忠誠地執行用戶交給它的任務,既然程序沒有給args數組設定參數值,那么JVM就不知道args數組的元素,所以JVM將args數組設置為一個長度為0的數組。

改為一下命令運行上面的程序:

java ArgsTest Java Spring

打印結果為:

2

Java

Spring

可以得出,如果運行java程序時在類名后面緊跟一個或多個字符串(多個字符串以空格隔開),JVM就會把這些字符串一次賦值給args數組元素。運行Java程序時的參數與args數組之間的關系為:第一個參數對應第一個數組元素,第二個參數對應第二個數組元素,... ,以此類推。

如果某參數本身包含了空格,則應該將該參數用雙引號""括起來,否則JVM會把這個空格當成參數分隔符,而不是當成參數本身。例如,采用如下命令來運行上面的程序:

java ArgsTest "Java Spring"

看到args的長度是1,只有一個數組元素,其值是Java Spring。

問題:如何實現在main()方法執行之前輸出"hello world"?

眾所周知,在Java語言中,main()方法是程序的入口方法,在程序運行時,最先加載的就是main()方法,但這是否意味着main()方法就是程序運行時第一個被執行的模塊呢?

答案是否定的。在Java語言中,由於靜態塊在類被加載時就會被調用,因此可以在main()方法執行前,利用靜態塊實現輸出“hello world”的功能,示例如下:

public class Test{

  static{

    System.out.println("hello world");

  }

  public static void main(String[] args){

    System.out.println("hello my world");

  }

}

程序運行結果為:

hello world

hello my world

由於靜態代碼塊不管順序如何,都會在main()方法執行之前執行,因此,以下代碼會與上面的代碼有同樣的輸出結果:

public class Test{

  public static void main(String[] args){

    System.out.println("hello my world");    

    static{

      System.out.println("hello world");

    }

  }

}

 

 

關注微信公眾號【Java典籍】,收看更多java技術干貨

 ▼微信掃一掃下圖↓↓↓二維碼關注

 

 


免責聲明!

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



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