Java程式的入口 main()方法的簽名為:public static void main(String[] args) {...} ,其中, ♦ public修飾符:Java類由JVM調用,為了讓JVM可以自由調用這個main()方法,所以使用public修飾符把這個方法暴露出來。 ♦ stat ...
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技術乾貨
▼微信掃一掃下圖↓↓↓二維碼關註