public staticvoid main(String[] args)為Java程序的入口方法,JVM在運行程序的時候,會首先查找main方法。
其中,public是權限修飾符,表明任何類或對象都可以訪問這個方法,static 表明 main 方法是一個靜態方法,即方法中的代碼是存儲在靜態存儲區的,只要類被加載后,就可以使用該方法而不需要通過實例化對象來訪問,可以直接通過類名.main() 直接訪問,JVM在啟動的時候就是按照上述方法的簽名(必須有 public 與 static 修飾,返回值為 void,且方法的參數為字符串數組)來查找方法的入口地址,如果能找到就執行,找不到則會報錯。void 表明方法沒有返回值,main 是 JVM 識別的特殊方法名,是程序的入口方法。字符串數組參數 args 為開發人員在命令行狀態下與程序交互提供了一種手段。
因為main為程序的入口方法,因此當程序運行的時候,第一個執行的方法就是main方法。通常來講,要執行一個類的方法,首先必須實例化一個類的對象,然后通過對象來調用這個方法。但是由於main是程序的入口方法,此時還沒有實例化對象,因此在編寫main方法的時候就要求不需要實例化對象就可以調用這個方法,鑒於此,main 方法需要被定義成 public 與 static。下例給出了在調用 main 方法時傳遞參數的方法。
public class Test{
public static void main(String[] args){
for(int i=0;i<args.length;i++){
System.out.println(args[i]);
}
}
}
在控制台下,使用javac Test.java指令編譯上述程序,使用javaTest arg1 arg2 arg3指令運行程序,程序輸出結果如下所示。
arg1 arg2 arg3
引申:
(1)main方法是否還有其它可用的定義格式?
1)由於public與static沒有先后順序關系,由此下面的定義也是合理的:
static public void main(String[] args)
2)也可以把main方法定義為final:
public static final void main(String[]args)
3)也可以用synchronized來修飾main方法:
static public synchronized voidmain(String[] args)
不管哪種定義方式,都必須保證main方法的返回值為void,有static與public關鍵字修飾。同時由於main方法為程序的入口方法,因此不能用abstract關鍵字來修飾。
(2)同一個.java文件中是否可以有多個main方法?
雖然每個類中都可以定義main方法,但是只有與文件名相同的用public修飾的類中的main方法才能作為整個程序的入口方法。如下例所示,創建了一個名為Test.java的文件。
class T{
public static void main(String[] args) {
System.out.println("T main");
}
}
public class Test {
// 程序入口函數
public static void main(String[] args) {
System.out.println("Test main");
}
}
程序運行結果為:
Test main
常見筆試題:
Java程序中程序運行入口方法main的簽名正確的有( )
A:publicstatic void main(String[] args) B:publicstatic final void main(String[] args)
C:staticpublic void main(String[] args) D:staticpublic synchronized void main(String[] args)
E:staticpublic abstract void main(String[] args)
答案: A、B、C、D。見上面講解。
例1:
//創建Hello.java
public class Hello
{
public static void main(String[] args)
{//args(arguments),類型是String的數組
//main的參數,有些人可以也寫成String args[]的形式,我是不建議,String[]這個形式是我推薦的,這個形式,更容易理解
System.out.println(args);
System.out.println(args.length);
}
}
javac Hello.java//編譯
java Hello//運行
運行結果:
[Ljava.lang.String;@15db9742
//說明這個參數的值是不空的
0
//說明傳遞了空數組過來
例2:
//創建Hello2.java
public class Hello2
{
public static void main(String[] args)
{//args(arguments),類型是String的數組
System.out.println(args.length);
for(int index=0;index<args.length;index ++)
{
System.out.println(args(index));
}
}
}
javac Hello2.java//編譯
java Hello2 A//運行
運行結果:
1
A
例3:
//創建Hello2.java
public class Hello2
{
public static void main(String[] args)
{//args(arguments),類型是String的數組
System.out.println(args.length);
for(int index=0;index<args.length;index ++)
{
System.out.println(args(index));
}
}
}
javac Hello2.java//編譯
java Hello2 A B C D E//運行
運行結果:
5
A
B
C
D
E