新生小白學Java必看之static從報錯到精通指南
前言
很多大一剛學 Java 的同學,最先懵、最容易報錯、最搞不明白的關(guān)鍵字 ——絕對是 static。
寫代碼的時候你一定遇到過:
- main 方法里調(diào)用自己寫的方法,直接爆紅報錯
- 多個對象操作同一個變量,數(shù)據(jù)互不影響,搞不懂原因
- 不知道什么時候該加 static、什么時候不能加,全靠瞎寫
- 疑惑為什么有的代碼還沒進入 main 就先打印輸出
其實 static 一點都不抽象!
本文專門針對大一 Java 新手,從零通俗講解、帶完整代碼、解決所有報錯、吃透 static 全部用法,重點加入執(zhí)行優(yōu)先級解析,看完直接從 “報錯懵逼” 進階到 “熟練使用”。
一、一句話吃透 static 核心本質(zhì)
記住這兩句話,你就懂了一半:
無 static:屬于對象,每個對象獨有一份
有 static:屬于類,所有對象共享一份
通俗比喻:普通成員就像自己專屬的生活用品,每個人都有自己的一份,互不干涉;被 static 修飾的成員就像教室公共設(shè)施,全班所有人共用同一份,一人修改,所有人看到的都會變。
static 的最大特點:不依賴對象,跟著類走,類一加載就存在。
二、static 可以修飾什么?
Java 中 static 只有四種用法,新手全部掌握就夠用:
- 靜態(tài)成員變量
- 靜態(tài)成員方法
- 靜態(tài)代碼塊
- 靜態(tài)內(nèi)部類
三、靜態(tài)成員變量 —— 全局共享數(shù)據(jù)
核心特點
- 歸屬整個類,不屬于單個對象
- 類加載時就初始化,優(yōu)先級高于對象
- 全局只有一份,所有對象共享同一個值
- 推薦使用 類名。變量名 方式訪問
實戰(zhàn)案例:統(tǒng)計對象創(chuàng)建次數(shù)

輸出結(jié)果:3
可以看出:所有對象共用同一個靜態(tài)變量,數(shù)據(jù)會累加。
四、靜態(tài)成員方法 —— 不用 new 對象直接用
你天天寫的 main 方法 就是最標準的靜態(tài)方法!
核心特點
- 屬于類,不用創(chuàng)建對象,可直接通過類名調(diào)用
- 加載優(yōu)先級高于普通方法
- 只能訪問靜態(tài)變量、靜態(tài)方法
- 不能使用 this 關(guān)鍵字
- 沒有多態(tài),不存在真正的方法重寫
新手最大報錯根源(必看)
在 main(靜態(tài)方法)中,不能直接調(diào)用普通非靜態(tài)方法!
報錯:無法從靜態(tài)上下文中引用非靜態(tài)方法
原因:靜態(tài)優(yōu)先級更高、先加載,普通非靜態(tài)還沒創(chuàng)建對象,所以不能直接訪問。
正確寫法
直接把方法也加上 static,或者創(chuàng)建對象再調(diào)用。

開發(fā)規(guī)范:工具類全部用 static
工具類不需要創(chuàng)建對象,統(tǒng)一寫法:私有構(gòu)造 + 靜態(tài)方法

五、靜態(tài)代碼塊 —— 優(yōu)先級最高、只執(zhí)行一次
核心特點
- 格式:
static { } - 擁有最高執(zhí)行優(yōu)先級,比 main 方法還要先運行
- 類加載時自動執(zhí)行,全程只執(zhí)行一次,不管 new 多少對象都不會重復
- 適合初始化靜態(tài)數(shù)據(jù)、配置信息
必背執(zhí)行優(yōu)先級順序(考試必考)
靜態(tài)代碼塊 > main 方法 > 構(gòu)造代碼塊 > 構(gòu)造方法
演示代碼

運行輸出

這就是為什么有時候還沒進入 main 方法,控制臺就先打印內(nèi)容,就是靜態(tài)代碼塊優(yōu)先級更高導致的。
六、靜態(tài)內(nèi)部類(了解即可)
新手只需記住三點:
- 被 static 修飾的內(nèi)部類
- 不用先創(chuàng)建外部類對象,可直接使用
- 只能訪問外部類中的靜態(tài)成員,遵循靜態(tài)優(yōu)先規(guī)則
七、大一新手必踩的 5 大 static 坑
局部變量不能加 static方法內(nèi)部的變量,絕對不能寫 static,直接編譯報錯!
靜態(tài)方法不能使用 thisthis 指代當前對象,靜態(tài)方法不屬于對象,不能用。
靜態(tài)不能直接訪問非靜態(tài)靜態(tài)資源優(yōu)先級高、先加載,非靜態(tài)屬于對象還沒創(chuàng)建,自然訪問不到。
不要隨便用 static 存可變數(shù)據(jù)全局共享,多對象同時修改會互相干擾,極易產(chǎn)生 bug。
靜態(tài)方法不存在重寫靜態(tài)方法是編譯期綁定,沒有多態(tài),子類只是 “隱藏” 父類方法,不是重寫。
八、終極總結(jié):到底什么時候加 static?
? 適合加 static
- 工具類通用方法
- 全局共享計數(shù)器、固定常量
- 只需初始化一次的配置資源
- 需要優(yōu)先加載、優(yōu)先執(zhí)行的代碼邏輯
? 不適合加 static
- 每個對象獨有的屬性
- 對象專屬的業(yè)務行為方法
- 會獨立變化、互不干擾的數(shù)據(jù)
寫在最后
static 的全部真理就一句話:
屬于類就加 static,屬于對象就不加!
再記住必考優(yōu)先級:靜態(tài)代碼塊 > main 方法 > 構(gòu)造代碼塊 > 構(gòu)造方法
只要你分清 對象級別 和 類級別,懂靜態(tài)優(yōu)先執(zhí)行規(guī)則,你再也不會報錯、再也不會亂寫 static。
本文適合大一 Java 新手收藏,以后碰到 static 報錯、寫代碼猶豫,直接翻這篇就夠了!
到此這篇關(guān)于新生小白學Java必看之static從報錯到精通的文章就介紹到這了,更多相關(guān)Java static報錯到精通內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 多線程Synchronized和Lock的區(qū)別
這篇文章主要介紹了Java 多線程Synchronized和Lock的區(qū)別,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2021-01-01
詳解IDEA中SpringBoot整合Servlet三大組件的過程
這篇文章主要介紹了詳解IDEA中SpringBoot整合Servlet三大組件的過程,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
MyBatis框架中Executor執(zhí)行器的使用及說明
文章詳細介紹了MyBatis的Executor執(zhí)行器,包括其定義、作用、生命周期、四種可選執(zhí)行器類型(SIMPLE、REUSE、BATCH、CachingExecutor)以及它們在執(zhí)行鏈路中的協(xié)作關(guān)系,文章還討論了插件機制、緩存機制、事務管理以及常見誤區(qū)澄清等內(nèi)容2025-11-11
Java數(shù)據(jù)結(jié)構(gòu)之對象比較詳解
這篇文章主要為大家詳細介紹了Java中對象的比較、集合框架中PriorityQueue的比較方式以及PriorityQueue的模擬實現(xiàn),感興趣的可以了解一下2022-07-07
java圖形化界面實現(xiàn)簡單混合運算計算器的示例代碼
這篇文章主要介紹了java圖形化界面實現(xiàn)簡單混合運算計算器的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11
Spring boot事件監(jiān)聽實現(xiàn)過程解析
這篇文章主要介紹了,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06

