為什么 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)

1、為什么main方法是靜態的(static)

  • 正因為main方法是靜態的,JVM調用這個方法就不需要創建任何包含這個main方法的實例。

  • 因為C和C++同樣有類似的main方法作為程序執行的入口。

  • 如果main方法不聲明為靜態的,JVM就必須創建main類的實例,因為構造器可以被重載,JVM就沒法確定調用哪個main方法。

  • 靜態方法和靜態數據加載到內存就可以直接調用而不需要像實例方法一樣創建實例后才能調用,如果main方法是靜態的,那么它就會被加載到JVM上下文中成為可執行的方法。

2、為什么main方法是公有的(public)

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

3、為什么main方法沒有返回值(Void)

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

4、總結

  • main方法必須聲明為public、static、void,否則JVM沒法運行程序

  • 如果JVM找不到main方法就拋出NoSuchMethodError:main異常,例如:如果你運行命令:java HelloWrold,JVM就會在HelloWorld.class文件中搜索public static void main (String[] args)?方法。

  • main方法是程序的入口,程序執行的開始處。

  • main方法被一個特定的線程”main”運行,程序會一直運行直到main線程結束或者non-daemon線程終止。

  • 當你看到“Exception in Thread main”如:Excpetion in Thread main:Java.lang.NullPointedException ,意味著異常來自于main線程。

  • 你可以聲明main方法使用java1.5的可變參數的方式如:
    public static void main(String... args)

  • 除了static、void、和public,你可以使用finalsynchronized、和strictfp修飾符在main方法的簽名中,如:
    public strictfp final synchronized static void main(String[] args)

  • main方法在Java可以像其他方法一樣被重載,但是JVM只會調用上面這種簽名規范的main方法。

  • 你可以使用throws子句在方法簽名中,可以拋出任何checked和unchecked異常。

  • 靜態初始化塊在JVM調用main方法前被執行,它們在類被JVM加載到內存的時候就被執行了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444111.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444111.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444111.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

返回地址【數據結構】

小問題? 1.我們是如何根據地址值來找到我們對應的數據的? 詳細陳述一下:當我們開辟一個整數類型,取名為a,假設地址空間是從數值為2000進行存儲,并且我們假設整形占用4個字節,那么我們在內存中需…

【超級詳細的小白教程】Hexo 搭建自己的博客

– 前言 這是一篇有關如何使用 Github Pages 和 Hexo 搭建屬于自己獨立博客的詳盡教程,本人是軟件工程專業本科生,目前只學習了C和C編程語言,對網站開發的有關知識幾乎為零,這也是我搭建好自己的博客之后寫的第一篇博客&#xff…

面向對象思想精華總結

一、三大特性 封裝繼承多態 二、類圖 泛化關系 (Generalization)實現關系 (Realization)聚合關系 (Aggregation)組合關系 (Composition)關聯關系 (Association)依賴關系 (Dependency) 三、設計原則 S.O.L.I.D其他常見原則 參考資料 一、三大特性 封裝 利用抽象數據類型將數據…

數組名與指向數組的指針之間的聯系與區別【數據結構】

我們遇到一個非常棘手的問題,這個問題就是,對于一堆數據來說,我們進行存儲,放到一個指定的倉庫當中,先前我們使用數組加加標的形式進行訪問倉庫當中的元素位置,但是呢,現在我們使用的是一個指針…

Struts2的action中處理JSONP方式提交的中文亂碼問題:

昨天在做公司網站的時候出現了一個中文亂碼問題,讓我郁悶了一晚上和一上午,最后在網友的提示下,我終于解決了,現在寫出來供后來的兄弟們參考: 1.問題是這樣的,就是客戶端是以JSONP的方式提交的數據&#x…

leetcode509. 斐波那契數(矩陣快速冪)

斐波那契數,通常用 F(n) 表示,形成的序列稱為斐波那契數列。該數列由 0 和 1 開始,后面的每一項數字都是前面兩項數字的和。也就是: F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1. 給定 N,計算 F(N)。…

insert函數的修改,

我們來看一下圖片當中的第2個圓圈,為什么使用size來相加呢?我們知道一開始我們定義的初始空間為init_size;我們想一下啊,如果是第1次進行空間的增加,那么我們使用InIt來進行相加是可以的,但是當第2次想加我們再想開辟空…

leetcode520. py解字符串真是太殘暴了

給定一個單詞,你需要判斷單詞的大寫使用是否正確。 我們定義,在以下情況時,單詞的大寫用法是正確的: 全部字母都是大寫,比如"USA"。 單詞中所有字母都不是大寫,比如"leetcode"。 如果…

【數據結構】線性表大咖

循環鏈表的介紹 概念:鏈表的最后一個節點的指針,由原來的 空指針變成指向第1個節點的鏈表。 類比:我們進行串珠子的操作,將首尾通過線進行連接,同樣我們的鏈表就是通過指針指向的方式進行連接,使其成為一…

leetcode551. 學生出勤記錄 I

給定一個字符串來代表一個學生的出勤記錄,這個記錄僅包含以下三個字符: A : Absent,缺勤 L : Late,遲到 P : Present,到場 如果一個學生的出勤記錄中不超過一個A(缺勤)并且不超過兩個連續的L(遲到),那么這個學生會被獎…

一元多項式的表示和相加【數據結構】

一元多項式的表示和相加 運算只是一個定義,一切的一切,到最后都必須歸咎于存儲結構當中,實現物理存儲,一元多項式包括數據對象數據關系以及數據之間的各種操作, 一元多項式的實現:用帶表頭結點的有序鏈表…

線性結構基本概念【數據結構】F

線性表的概念:線性表是一種最簡單的線性結構,線性結構是單個數據元素的有序結合 線性結構的基本特征為: 第一,集合中必存在唯一的一個第1元素, 第二,集合中必存在唯一的一個最后元素, 第三&am…

leetcode589. N叉樹的前序遍歷

給定一個 N 叉樹&#xff0c;返回其節點值的前序遍歷。 例如&#xff0c;給定一個 3叉樹 : 返回其前序遍歷: [1,3,5,6,2,4]。 思路&#xff1a;先放入自己&#xff0c;再依次遍歷孩子。 /* // Definition for a Node. class Node {public int val;public List<Node> c…

ORA-00001 違反唯一約束條件

程序跑出下面的異常&#xff1a;com.ibm.websphere.ce.cm.DuplicateKeyException: ORA-00001: 違反唯一約束條件 (EOMS3.SYS_C0024492)&#xff0c;參考下面的文章了解到我的程序可能是序列的問題。&#xff08;果然是序列產生的最小值設置的太小&#xff0c;將序列值設置大之后…

順序結構實現【數據結構】

雖然在數據結構當中是先出現的線性表&#xff0c;然后出現的是數組 一&#xff1a;線性表的順序存儲結構 順序映象&#xff1a;用一組地址連續的存儲單元依次存放線性表當中的數據元素 線性表的起始地址&#xff1a;線性存儲第一個數據元素的地址&#xff0c;我們也稱作是基地址…

leetcode590. N叉樹的后序遍歷

給定一個 N 叉樹&#xff0c;返回其節點值的后序遍歷。 例如&#xff0c;給定一個 3叉樹 : 思路&#xff1a;先遍歷所有孩子&#xff0c;再放入自己。 /* // Definition for a Node. class Node {public int val;public List<Node> children;public Node() {}public No…

鏈表的形式【F】

數據元素之間的關系在計算機中有兩種表示方法: 順序映象, 非順序映象. 對應兩種存儲結構: 順序存儲結構, 鏈式存儲結構 線性結構就是一種邏輯關系&#xff0c;方便我們對數據進行研究但是不考慮真實的存儲結構 數據是什么&#xff1f; 數據是能夠反應一定內容的一組數據類型的…

leetcode892. 三維形體的表面積

在 N * N 的網格上&#xff0c;我們放置一些 1 * 1 * 1 的立方體。 每個值 v grid[i][j] 表示 v 個正方體疊放在對應單元格 (i, j) 上。 請你返回最終形體的表面積。 示例 1&#xff1a; 輸入&#xff1a;[[2]] 輸出&#xff1a;10 示例 2&#xff1a; 輸入&#xff1a;…

leetcode914. 卡牌分組

給定一副牌&#xff0c;每張牌上都寫著一個整數。 此時&#xff0c;你需要選定一個數字 X&#xff0c;使我們可以將整副牌按下述規則分成 1 組或更多組&#xff1a; 每組都有 X 張牌。 組內所有的牌上都寫著相同的整數。 僅當你可選的 X > 2 時返回 true。 示例 1&#xf…

單鏈表的實現【數據結構】

思考&#xff1a; 1.是否能夠將原來指針的方向改為向前指向呢&#xff1f; 2.是否能夠有兩個指針域的操作呢&#xff1f; 了解&#xff1a; 單鏈表是應用最廣泛的一種形式&#xff0c;還有雙向鏈表以及循環鏈表&#xff0c;這些都是要進行討論的 結構體定義的是什么&#xff1f…