static關鍵字有何魔法?竟讓Spring Boot搞出那麼多靜態內部類
阿新 • • 發佈:2020-07-16
> 生命太短暫,不要去做一些根本沒有人想要的東西。本文已被 [**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非靜態) --> 我理解這是普通內部類能 **“存活”** 下來的最大理由了吧