1. 程式人生 > >詳細講解java的main方法為什麼使用public static void修飾符修飾

詳細講解java的main方法為什麼使用public static void修飾符修飾

今天看型別資訊時發現一個問題,不能再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方法的例項(即不再需要建立物件,通過物件例項去呼叫裡,而由java虛擬機器找到這個入口直接開始執行)。
  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方法的的執行緒名字為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方法為什麼使用public static void修飾修飾

今天看型別資訊時發現一個問題,不能再main方法中列印this關鍵字的資訊,這時想起了之前的知識,不能在靜態方法中呼叫this。理由很簡單,this表示“這個物件”,也就是宣告一個類的物件,然而靜態方法是不屬於某一個特定物件而是屬於這個類的。那麼問題來了,為什麼main函式必須設定成靜態的呢?首先,main函

eclipse 運行錯誤:在類XXX中找不到 main 方法, 請將 main 方法定義為: public static void main(String[] args) 否則 JavaFX 應用程序類必須擴展javafx.application.Application

分享圖片 java stat 報錯 es2017 pub .... img nbsp 新建了一個類Hello: 代碼: 第一次運行報錯: 點擊關閉該類的界面時出現: 點擊是,然後再次打開,可以正確執行,結果為: 這是為什麽.... ec

錯誤: 在類 Main 中找不到 main 方法, 請將 main 方法定義為: public static void main(String[] args) 否則 JavaFX 應用程序類必須擴展javafx.application.Application

導包 javafx 其他 就是 ring del args bsp pub 錯誤: 在類 Main 中找不到 main 方法, 請將 main 方法定義為: public static void main(String[] args)否則 JavaFX 應用程序類必須擴展

錯誤: 在類 com.js.sort.ArraySort 中找不到 main 方法, 請將 main 方法定義為: public static void main(String[] args) 否則 JavaFX 應用程式類必須擴充套件javafx.application.Application

https://blog.csdn.net/liu1340308350/article/details/80746671 開啟: eclipse ->window->preference->run and debug->Lunching    將第一行Sav

錯誤: 在類中找不到 main 方法, 請將 main 方法定義為: public static void main(String[] args) 否則

錯誤: 在類 ZiFUChuan.Pyramid 中找不到 main 方法, 請將 main 方法定義為:    public static void main(String[] args) 否則 JavaFX 應用程式類必須擴充套件javafx.application.Ap

為什麽main方法public static void

否則 鏈接 靜態 訪問 運行命令 containe zed zju 編程 Main方法是我們學習Java編程語言時知道的第一個方法,你是否曾經想過為什麽main方法是public、static、void的。當然,很多人首先學的是C和C++,但是在Java中main方法與前者

關於public static void main(String[] args)方法

ati ring 順序 nal nbsp 靜態方法 abs stat 行程 這個方法是java程序的入口,JVM在運行程序的時候,會首先查找main()方法。 用static修飾表示是靜態方法,所以可以通過類名.main()直接訪問該方法。通常我們要執行一個類的方法,先必

【java】Static解讀和public static void main(String[] args)詳細分析

首先問一個問題: public static void main(String[] args)程式碼代表了什麼含義?以及思考為什麼java程式一開始就會進入main()函式,其實c、c++也是如此?後面一個問題有static的基礎就非常容易。(後一個問題的答案提前公佈:用s

public static void main(String arg[]) 詳細解釋

public static void main(String arg[]) 該語句定義了main方法. main方法是程式執行的入口,所有的java程式都必須具備一個main()方法,而且必須按照如上的格式來定義. 不具有main方法的類可以編譯,但不能執行.因為

類中找不到main方法請將main方法定義為public static void main. 否則 JavaFX 應用程式類必須擴充套件javafx.application.Application

 最近在使用elcipise編寫java程式時遇到這樣一個問題:錯誤在類中找不到main方法,請將main方法定義為 public static void main(String[] args)否則 JavaFX 應用程式類必須擴充套件javafx.application.A

錯誤: 在類中找不到 main 方法, 請將 main 方法定義為:public static void main(String[] args)否則 JavaFX 應用程式類必須擴充套件javafx.ap

最近在使用eclipse編寫java程式時遇到這樣一個問題:  錯誤在類中找不到main方法,請將main方法定義為 p

public static void Swap2

swa let class value sum ons orm print valueof public class Swap2 { public static void Swap2 (IDemo a, IDemo b) {

public static void main(string[] args)解釋

mac env 必須 ase pla 分享 知識庫 div main函數 這個問題困擾我好久了,今天就一查究竟,畢竟我好奇心比較重 1. why “public” 因為Java程序是通過jvm虛擬機調用的,所以main()函數要是想被

在java中public voidpublic static void區別

sta erro ati 對象 方法 這樣的 調用 必須 靜態方法 static 方法可以被main方法直接調用,而非static方法不可以。因為static方法是屬於類的,是類方法。可以通過類名.方法名直接調用。而非static方法必須等對象被new出來以後才能使用,因而

public voidpublic static void區別

pub add 資源 我們 普通 link bsp 圖片 區別 我們換個簡單易懂的說法,這兩句的區別就在於,能不能直接用類名訪問。 很好理解的不是嗎? 假如,我有一個類,如下圖所示: 接下來先實例化一個對象,ca,你會發現它不僅可以訪問普通的方法,也可以訪問靜態的方法

public static void main(String[] args) 什麼意思

public static void main(String[] args)   這絕對不是憑空想出來的,也不是沒有道理的死規定,而是java程式執行的需要。   jvm在試圖執行一個類之前,先檢查該類是否包含一個特殊方法。這個方法必須是公有的,以便在任何

Java面試筆試-003-public static void main(String[] args)

描述 1)public public是許可權修飾符,表明任何類或物件都可以訪問這個方法。 2)static static表明main()方法是一個靜態方法,即方法中的程式碼是儲存在靜態儲存區的,只要類被載入後,就可以使用該方法而不需要通過例項化物

Java中的異常處理 public static void main(String[] args) { try{ System.out.println(c

1.異常的概念 首先我們在講解異常的時候先回想一下我們以前寫過是程式碼: package com.bittech.sthrow; /** * Author:WSChase * Created:2018/11/28 */ public class Throw1 { //計算

public static void main(String[] args){}函式詮釋

主函式的一般寫法如下:  public static void main(String[] args){…}  下面分別解釋這些關鍵字的作用:  (1)public關鍵字,這個好理解,宣告主函式為public就是告訴其他的類可以訪問這個函式。  (2)static關鍵字,告知

山科java實驗3-2 在安排教師監考時,需要從一組教師中隨機選取n個教師參加監考。要求實現一個類RandomTeacher的靜態方法public static String[] getRandomT

在安排教師監考時,需要從一組教師中隨機選取n個教師參加監考。要求實現一個類RandomTeacher的靜態方法public static String[] getRandomTeachers(String[] teachers, int n),能夠從teachers中隨機選擇