為什麼需要 public static void main(String[] args) 這個方法?
阿新 • • 發佈:2021-11-10
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
本文來自部落格園,作者:走馬!,轉載請註明原文連結:https://www.cnblogs.com/zou-ma/p/15535766.html