1. 程式人生 > 其它 >為什麼需要 public static void main(String[] args) 這個方法?

為什麼需要 public static void main(String[] args) 這個方法?

​ 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