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

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

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

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

運(yùn)行輸出

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

