1. 程式人生 > >static關鍵字有何魔法?竟讓Spring Boot搞出那麼多靜態內部類

static關鍵字有何魔法?竟讓Spring Boot搞出那麼多靜態內部類

> 生命太短暫,不要去做一些根本沒有人想要的東西。本文已被 [**https://www.yourbatman.cn**](https://www.yourbatman.cn) 收錄,裡面一併有Spring技術棧、MyBatis、JVM、中介軟體等小而美的**專欄**供以免費學習。關注公眾號【**BAT的烏托邦**】逐個擊破,深入掌握,拒絕淺嘗輒止。 [TOC] ![](https://img-blog.csdnimg.cn/20200716110855764.png) # 前言 各位小夥伴大家好,我是A哥。[上篇文章](https://mp.weixin.qq.com/s/VTB9f8S6TYeuNVd4Z71zUw)瞭解了**static關鍵字 + @Bean方法**的使用,知曉了它能夠提升Bean的優先順序,在@Bean方法前標註static關鍵字,特定情況下可以避免一些煩人的“警告”日誌的輸出,排除隱患讓工程變得更加安全。我們知道static關鍵字它不僅可使用在方法上,那麼本文將繼續挖掘static在Spring環境下的用處。 根據所學的JavaSE基礎,static關鍵字除了能夠修飾方法外,還能使用在這兩個地方: 1. 修飾類。確切的說,應該叫修飾**內部類**,所以它叫靜態內部類 2. 修飾成員變數 > 其實static還可以修飾程式碼塊、static靜態導包等,但很明顯,這些與本文無關 接下來就以這為兩條主線,分別研究static在對應場景下的作用,本文將聚焦在靜態內部類上。 ![](https://img-blog.csdnimg.cn/20200601065329491.png) --- ## 版本約定 本文內容若沒做特殊說明,均基於以下版本: - JDK:`1.8` - Spring Framework:`5.2.2.RELEASE` --- # 正文 說到Java裡的static關鍵字,這當屬最基礎的入門知識,是Java中常用的關鍵字之一。你平時用它來修飾變數和方法了,但是對它的瞭解,即使放在JavaSE情景下知道這些還是**不夠的**,問題雖小但這往往反映了你對Java基礎的瞭解程度。 當然嘍,本文並不討論它在JavaSE下使用,畢竟咱們還是**有一定逼格的**專欄,需要進階一把,玩玩它在Spring環境下到底能夠迸出怎麼樣的火花呢?比如靜態內部類~ --- ## Spring下的靜態內部類 static修飾類**只有一種情況**:那就是這個類屬於內部類,這就是我們津津樂道的**靜態內部類**,形如這樣: ```java public class Outer { private String name; private static Integer age; // 靜態內部類 private static class Inner { private String innerName; private static Integer innerAge; public void fun1() { // 無法訪問外部類的成員變數 //System.out.println(name); System.out.println(age); System.out.println(innerName); System.out.println(innerAge); } } public static void main(String[] args) { // 靜態內部類的例項化並不需要依賴於外部類的例項 Inner inner = new Inner(); } } ``` 在實際開發中,靜態內部類的使用場景是非常之多的。 --- ### 認識靜態/普通內部類 由於一些小夥伴對普通內部類 vs 靜態內部類傻傻分不清,為了方便後續講解,本處把**關鍵要素**做簡要對比說明: 1. 靜態內部類可以宣告靜態or例項成員(屬性和方法);而普通內部類則**不可以**宣告靜態成員(屬性和方法) 2. 靜態內部類例項的建立**不依賴於**外部類;而普通外部類例項建立必須先有外部類例項才行(繫結關係拿捏得死死的,不信你問鄭凱) 3. 靜態內部類**不能**訪問外部類的例項成員;而普通內部類可以隨意訪問(不管靜態or非靜態) --> 我理解這是普通內部類能 **“存活”** 下來的最大理由了吧