1. 程式人生 > >為什麽java的main方法必須是靜態的

為什麽java的main方法必須是靜態的

博客 核心 log sync 簡單 chm 之前 excpetion 訪問

今天看類型信息時發現一個問題,不能再main方法中打印this關鍵字的信息,這時想起了之前的知識,不能再靜態方法中調用this。理由很簡單,this表示“這個對象”,也就是聲明一個類的對象,然而靜態方法是不屬於某一個特定對象而是屬於這個類的。那麽問題來了,為什麽main函數必須設置成靜態的呢?

首先,main函數作為java程序的入口,也可以理解為一個接口,這個接口不是提供給程序員使用的,這時提供給用戶等使用的,用戶等不需要知道程序內部的實現,只需要知道接口就可以了,如果是非靜態的,那麽當用戶開始使用時,就必須先去創建對象,那麽創建對象的代碼又寫在哪裏呢?呵呵,所以這個很難講清。

看了一篇博客,寫得還可以,轉載過來。以下內容來自http://www.cnblogs.com/yangyisen/p/5108513.html。


Main方法是我們學習Java編程語言時知道的第一個方法,你是否曾經想過為什麽main方法是public、static、void的。當然,很多人首先學的是C和C++,但是在Java中main方法與前者有些細微的不同,它不會返回任何值,為什麽main方式是public、static、void,這篇文章嘗試去找到一些答案。

Main方法是Java程序的入口,記住,我們這裏不會討論Servlet、MIDlet和其他任何容器管理的java程序,在java核心編程中,JVM會查找類中的public static void main(String[] args),如果找不到該方法就拋出錯誤NoSuchMethodError:main 程序終止。
Main方法必須嚴格遵循它的語法規則,方法簽名必須是public static void,參數是字符串數組類型,如果是Java1.5及以後的版本還可以使用可變參數:

public  static void main(String... args)

為什麽main方法是靜態的(static)

  1. 正因為main方法是靜態的,JVM調用這個方法就不需要創建任何包含這個main方法的實例。
  2. 因為C和C++同樣有類似的main方法作為程序執行的入口。
  3. 如果main方法不聲明為靜態的,JVM就必須創建main類的實例,因為構造器可以被重載,JVM就沒法確定調用哪個main方法。
  4. 靜態方法和靜態數據加載到內存就可以直接調用而不需要像實例方法一樣創建實例後才能調用,如果main方法是靜態的,那麽它就會被加載到JVM上下文中成為可執行的方法。
為什麽main方法是公有的(public)

Java指定了一些可訪問的修飾符如:private、protected、public,任何方法或變量都可以聲明為public,Java可以從該類之外的地方訪問。因為main方法是公共的,JVM就可以輕松的訪問執行它。

為什麽main方法沒有返回值(Void)

因為main返回任何值對程序都沒任何意義,所以設計成void,意味著main不會有任何值返回

總結

    1. main方法必須聲明為public、static、void,否則JVM沒法運行程序
    2. 如果JVM找不到main方法就拋出NoSuchMethodError:main異常,例如:如果你運行命令:java HelloWrold,JVM就會在HelloWorld.class文件中搜索public static void main (String[] args) 放法
    3. main方式是程序的入口,程序執行的開始處。
    4. main方法被一個特定的線程”main”運行,程序會一直運行直到main線程結束或者non-daemon線程終止。
    5. 當你看到“Exception in Thread main”如:Excpetion in Thread main:Java.lang.NullPointedException ,意味著異常來自於main線程
    6. 你可以聲明main方法使用java1.5的可變參數的方式如:
      public  static void main(String... args)
    7. 除了static、void、和public,你可以使用final,synchronized、和strictfp修飾符在main方法的簽名中,如:
      public  strictfp final  synchronized static  void main(String[] args)
    8. main方法在Java可以像其他方法一樣被重載,但是JVM只會調用上面這種簽名規範的main方法。
    9. 你可以使用throws子句在方法簽名中,可以拋出任何checked和unchecked異常
    10. 靜態初始化塊在JVM調用main方法前被執行,它們在類被JVM加載到內存的時候就被執行了。

為什麽java的main方法必須是靜態的