為什麼 main 方法是 public static void ?

来源:https://www.cnblogs.com/japtx/archive/2019/11/02/11784143.html
-Advertisement-
Play Games

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


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載入到記憶體的時候就被執行了。

---------------------摘自:improtNew


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在docker compose編排多個容器時,需要按實際情況控制各容器的啟動順序,本文是《docker compose下的java應用啟動順序兩部曲》的第一篇,文中會分析啟動順序的重要性,以及啟動順序有問題時會有什麼樣的影響,再給出臨時解決的和官方推薦的兩種解決方案,為下一篇的實戰做好鋪墊。 環境信 ...
  • 首先報這個錯誤,你得明白,是什麼原因導致的? 答:未引入命名空間,和約束文件 解決方法: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:x ...
  • 下麵是我花費兩個星期做的準備,主要分三部分: 有計劃——計劃好每天要複習的知識模塊(內容較多) 高效率——從整體到細節,著重把知識點“手寫”到自己的電腦記錄本 優簡歷——展示你的項目亮點,難點 有計劃: 1. 反思:為什麼好多知識看過後不能記住,面試一緊張更加想不起?一方面自己沒有深入學習,另一方面 ...
  • 1. 主程式類: 2. pom.xml: 3. 使用maven打包(clean package),此war包可以用於傳統的部署方式(外部tomcat),也可以直接使用java jar 的方式運行。 ...
  • [toc] GIT版本管理工具教程 一 Git初始化 1. 下載安裝, 下載地址: https://git scm.com/downloads 每個系統的都有(linux、mac、windows等),看官網的安裝教程,很詳細,此處我以windows來練習 2. 首先創建一個文件夾,這個文件夾就是我們 ...
  • urllib下載圖片 urllib3下載圖片 Urllib下載圖片 1 from urllib import request 2 import re 3 import os 4 5 # 妹子圖首頁 下載首頁的幾張 6 url = 'https://www.mzitu.com' 7 # Request ...
  • 操作系統 : CentOS7.3.1611_x64 Python 版本 : 3.6.8 Apollo源碼地址: https://github.com/ctripcorp/apollo 訪問Apollo使用這個庫: https://github.com/filamoon/pyapollo 不要使用py ...
  • PHP技術交流QQ群(各個大佬線上解答技術問題): 953618831 0、用單引號代替雙引號來包含字元串,這樣做會更快一些。因為PHP會在雙引號包圍的字元串中搜尋變數,單引號則不會,註意:只有echo能這麼做,它是一種可以把多個字元串當作參數的“函數”(譯註:PHP手冊中說echo是語言結構,不是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...