<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java `main()`方法 > 原文: [https://howtodoinjava.com/java/basics/main-method/](https://howtodoinjava.com/java/basics/main-method/) 您是否曾經嘗試過說明 **Java `main()`方法**是`public`,`static`和`void`的原因? 為什么叫`main`? 當您調用`main()`方法時,JVM 內部會發生什么? `main()`方法的**目的**是什么? 讓我們找出答案。 ```java Table of Contents 1\. Java main method syntax 2\. Why main method is public? 3\. Why main method is static? 4\. Why main method is void? 5\. Why the name is main? 6\. What happens internally when you invoke main method? 7\. main() method native code in java.c 8\. Do we always need main method to run java program? 9\. Summary ``` ## 1\. Java `main()`方法語法 首先提醒一下 Java 中`main`方法的**語法**。 ```java public class Main { public static void main(String[] args) { System.out.println("Hello World !!"); } } ``` ## 2\. 為什么 Java `main()`方法是公開的? 這個大問題也許也是最困難的。 我盡力在我能獲得的所有良好學習材料中找到找到此問題的一個很好的理由,但沒有任何證據被證明是足夠的。 因此,我的分析(與許多其他方法一樣)說:**`main()`方法是公共的,因此可以在任何地方以及可能希望使用它啟動應用程序**的每個對象中訪問。 在這里,我并不是說 JDK / JRE 具有類似的原因,因為`java.exe`或`javaw.exe`(對于 Windows)使用 **Java 本機接口**(JNI)對`invoke`方法的調用,因此無論使用哪種訪問修飾符,它們都可以被調用。 回答這個問題的第二種方法是另一個問題,為什么不公開? Java 中的所有方法和構造器都有一些訪問修飾符。 `main()`方法也需要一個。 沒有理由不應該將其設置為`public`,而應使用任何其他修飾符(默認/受保護/私有)。 請注意,如果不使用`main()`方法`public`,則不會發生編譯錯誤。 您將出現**運行時錯誤**,因為不存在匹配的`main()`方法。 請記住,整個語法應該匹配才能執行`main()`方法。 ```java public class Main { void static main(String[] args) { System.out.println("Hello World !!"); } } ``` 程序輸出: ```java Error: Main method not found in class Main, please define the main method as: public static void main(String[] args) ``` ## 3\. 為什么 Java `main()`方法是靜態的? 另一個大問題。 為了理解這一點,假設我們沒有`main`方法為`static`。 現在,要調用任何方法,您需要它的一個實例。是吧? **眾所周知,Java 可以具有重載的構造器。 現在,應該使用哪一個,重載的構造器的參數將從何處來**。 這些只是更困難的問題,這些問題幫助 Java 設計人員下定了決心,并將`main()`方法設為`static`。 請注意,如果不使用`main()`方法`static`,則不會發生編譯錯誤。 您將**運行時錯誤**。 ```java public class Main { public void main(String[] args) { System.out.println("Hello World !!"); } } ``` 程序輸出: ```java Error: Main method is not static in class main, please define the main method as: public static void main(String[] args) ``` ## 4\. 為什么 Java `main()`方法是`void`? 為什么不應該無效? 您是否從代碼中調用過此方法? 沒有。 **因此,沒有任何將值返回給實際調用此方法**的 JVM 的用途。 它根本不需要任何返回值。 應用程序唯一想與調用過程進行通信的是正常終止還是異常終止。 使用`System.exit(int)`已經可以做到這一點。 非零值表示異常終止,否則一切正常。 ## 5\. 為什么名字叫`main`? 沒有堅如磐石的理由。 假設因為**它已經與 C 和 C++ 語言**一起使用。 因此,大多數開發人員已經對這個名稱感到滿意。 否則,沒有其他充分的理由。 ## 6\. 調用`main`方法在內部會發生什么? Java 中`main()`方法的**用途是程序執行的起點**。 當您運行`java.exe`,然后運行**時,有幾個 Java 本機接口(JNI)調用**。 這些調用會加載真正是 JVM 的 DLL(是的-`java.exe`不是 JVM)。 JNI 是我們在虛擬機世界和 C,C++ 等世界之間架起橋梁時所使用的工具。反之亦然。 如果不使用 JNI,就不可能真正使 JVM 運行。 基本上,`java.exe`是一個超級簡單的 C 應用程序,解析命令行,在 JVM 中創建一個新的`String`數組來保存這些參數,解析出您指定來包含`main()`的類名,使用 JNI 調用來查找`main()`方法本身,然后調用`main()`方法,傳入新創建的字符串數組作為參數。 這非常類似于使用 Java 反射時的操作,只是使用了令人困惑的命名本機函數調用。 > 對于您來說,編寫自己的`java.exe`版本(源代碼隨 JDK 分發)并執行完全不同的操作是完全合法的。 ## 7\. `java.c`中的`main()`方法本機代碼 下載并解壓縮源 jar 并簽出`../launcher/java.c`。 它是這樣的: ```java /* * Get the application's main class. */ if (jarfile != 0) { mainClassName = GetMainClassName(env, jarfile); ... ... mainClass = LoadClass(env, classname); if(mainClass == NULL) { /* exception occured */ ... ... /* Get the application's main method */ mainID = (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V"); ... ... {/* Make sure the main method is public */ jint mods; jmethodID mid; jobject obj = (*env)->ToReflectedMethod(env, mainClass, mainID, JNI_TRUE); ... ... /* Build argument array */ mainArgs = NewPlatformStringArray(env, argv, argc); if (mainArgs == NULL) { ReportExceptionDescription(env); goto leave; } /* Invoke main method. */ (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs); ``` 因此,在這里您可以看到**用`main`方法**調用 Java 程序時會發生什么。 ## 8\. 我們是否總是需要`main`方法來運行 Java 程序? 我相信不是。 我們有 applet,在這里我們沒有編寫`main`方法。 我仍然需要檢查它們是如何執行的。 如果您已經知道,請與我分享。 ## 9\. 總結 所有開發人員都使用 Java 的`main`方法,每個人都知道編寫它的基本語法。 但是,很少有人完全理解正確的推理及其工作方式。 我仍在努力尋求更多的理解,如果發現更多有趣的事實,將更新這篇文章。 如果您有什么要分享的內容,請在評論部分添加或給我發送郵件。 在這篇文章中,我將包含在您的知識中。 學習愉快! 參考: [StackOverflow](https://stackoverflow.com/questions/146576/why-is-the-java-main-method-static?page=1&tab=votes#tab-top "source information")
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看