最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?靜態(tài)機(jī)制之靜態(tài)變量、方法、代碼塊與類(lèi)加載深入理解

 更新時(shí)間:2025年11月03日 09:52:19   作者:7澄1  
本文全面解析了Java中static關(guān)鍵字的特性與應(yīng)用,靜態(tài)機(jī)制使成員與類(lèi)本身關(guān)聯(lián),包括靜態(tài)變量(存儲(chǔ)在方法區(qū),所有對(duì)象共享)、靜態(tài)方法(可通過(guò)類(lèi)名直接調(diào)用,不能訪問(wèn)實(shí)例成員)和靜態(tài)代碼塊(類(lèi)加載時(shí)執(zhí)行),感興趣的朋友跟隨小編一起看看吧

引入

在 Java 中,`static` 是一個(gè)極具特色的關(guān)鍵字,它讓成員(變量、方法、代碼塊)與**類(lèi)本身**關(guān)聯(lián),而非與類(lèi)的對(duì)象關(guān)聯(lián)。理解靜態(tài)機(jī)制是掌握 Java 類(lèi)加載、單例模式、工具類(lèi)設(shè)計(jì)的基礎(chǔ)。本文將圍繞**靜態(tài)變量**、**靜態(tài)方法**、**靜態(tài)代碼塊**的特性展開(kāi),結(jié)合內(nèi)存模型、類(lèi)加載順序和繼承場(chǎng)景,全面解析 Java 靜態(tài)機(jī)制的底層邏輯與實(shí)戰(zhàn)應(yīng)用,幫助讀者徹底厘清“靜態(tài)”與“非靜態(tài)”的本質(zhì)區(qū)別。

一、靜態(tài)變量:類(lèi)級(jí)別的共享數(shù)據(jù)

1.1 靜態(tài)變量的定義與特性

靜態(tài)變量(類(lèi)變量)是被 `static` 修飾的成員變量,它屬于**類(lèi)本身**,而非類(lèi)的對(duì)象。所有對(duì)象共享同一份靜態(tài)變量,修改一個(gè)對(duì)象的靜態(tài)變量會(huì)影響所有對(duì)象。

public class Demo {
    public static String from = "默認(rèn)值";
}
public class TestConfigParser {
    public static void main(String[] args) {
        Demo demo = new Demo();
        Demo demo1 = new Demo();
        Demo demo2 = new Demo();
        demo.from = "中國(guó)"; // 修改靜態(tài)變量
        System.out.println(demo.from);   // 輸出:中國(guó)
        System.out.println(demo1.from);  // 輸出:中國(guó)(所有對(duì)象共享)
        System.out.println(demo2.from);  // 輸出:中國(guó)(所有對(duì)象共享)
    }
}

1.2 靜態(tài)變量的內(nèi)存模型

- 靜態(tài)變量存儲(chǔ)在**方法區(qū)的靜態(tài)常量池**中,屬于類(lèi)的元數(shù)據(jù)的一部分;

- 非靜態(tài)變量(實(shí)例變量)存儲(chǔ)在**堆內(nèi)存的對(duì)象實(shí)例中**,每個(gè)對(duì)象有獨(dú)立的副本。

變量類(lèi)型存儲(chǔ)區(qū)域所屬者副本情況
靜態(tài)變量方法區(qū)(靜態(tài)常量池)類(lèi)所有對(duì)象共享一份
實(shí)例變量堆內(nèi)存(對(duì)象實(shí)例)對(duì)象每個(gè)對(duì)象一份

二、靜態(tài)方法:類(lèi)級(jí)別的行為操作

2.1 靜態(tài)方法的定義與特性

靜態(tài)方法是被 `static` 修飾的成員方法,它屬于**類(lèi)本身**,可通過(guò)“類(lèi)名.方法名”直接調(diào)用,無(wú)需創(chuàng)建對(duì)象。

public class MathUtil {
    // 靜態(tài)方法:工具類(lèi)方法,無(wú)需依賴(lài)對(duì)象狀態(tài)
    public static int add(int a, int b) {
        return a + b;
    }
}
public class Test {
    public static void main(String[] args) {
        // 直接通過(guò)類(lèi)名調(diào)用靜態(tài)方法,無(wú)需創(chuàng)建對(duì)象
        int result = MathUtil.add(3, 5);
        System.out.println(result); // 輸出:8
    }
}

2.2 靜態(tài)方法與非靜態(tài)方法的核心區(qū)別

維度靜態(tài)方法非靜態(tài)方法
所屬者類(lèi)對(duì)象
調(diào)用方式類(lèi)名。方法名 / 對(duì)象。方法名對(duì)象。方法名
this 關(guān)鍵字不可用(無(wú)所屬對(duì)象)可用(代表當(dāng)前對(duì)象)
非靜態(tài)成員訪問(wèn)不可直接訪問(wèn)非靜態(tài)變量 / 方法可直接訪問(wèn)靜態(tài)和非靜態(tài)成員

**代碼示例(靜態(tài)方法的限制)**:

public class Demo {
    private int instanceVar = 10; // 實(shí)例變量
    private static int staticVar = 20; // 靜態(tài)變量
    // 靜態(tài)方法
    public static void staticMethod() {
        // 編譯錯(cuò)誤:靜態(tài)方法不能直接訪問(wèn)實(shí)例變量
        // System.out.println(instanceVar);
        // 可以訪問(wèn)靜態(tài)變量
        System.out.println(staticVar); // 輸出:20
        // 編譯錯(cuò)誤:靜態(tài)方法中不能使用this
        // System.out.println(this.instanceVar);
    }
    // 非靜態(tài)方法
    public void instanceMethod() {
        // 可以訪問(wèn)實(shí)例變量和靜態(tài)變量
        System.out.println(instanceVar); // 輸出:10
        System.out.println(staticVar);   // 輸出:20
        // 可以使用this
        System.out.println(this.instanceVar); // 輸出:10
    }
}

三、靜態(tài)代碼塊:類(lèi)加載時(shí)的初始化邏輯

3.1 靜態(tài)代碼塊的定義與特性

靜態(tài)代碼塊是被 `static` 修飾的代碼塊,它在**類(lèi)加載時(shí)執(zhí)行**,且**只執(zhí)行一次**。常用于類(lèi)的初始化邏輯(如加載配置、初始化靜態(tài)變量等)。

public class Demo {
    static {
        System.out.println("靜態(tài)代碼塊1:類(lèi)加載時(shí)執(zhí)行,僅一次");
    }
    public static Demo demo = new Demo("靜態(tài)成員初始化");
    static {
        System.out.println("靜態(tài)代碼塊2:類(lèi)加載時(shí)執(zhí)行,僅一次");
    }
    public Demo(String msg) {
        System.out.println("構(gòu)造方法:" + msg);
    }
}
public class Test {
    public static void main(String[] args) {
        System.out.println("開(kāi)始創(chuàng)建對(duì)象");
        Demo demo = new Demo("main方法中創(chuàng)建對(duì)象");
    }
}

```

**運(yùn)行結(jié)果**:

```

靜態(tài)代碼塊1:類(lèi)加載時(shí)執(zhí)行,僅一次

構(gòu)造方法:靜態(tài)成員初始化

靜態(tài)代碼塊2:類(lèi)加載時(shí)執(zhí)行,僅一次

開(kāi)始創(chuàng)建對(duì)象

構(gòu)造方法:main方法中創(chuàng)建對(duì)象

```

3.2 靜態(tài)代碼塊的執(zhí)行順序

- 類(lèi)加載時(shí),**先執(zhí)行靜態(tài)代碼塊和靜態(tài)成員初始化**(按代碼出現(xiàn)的順序執(zhí)行);

- 之后才會(huì)執(zhí)行 `main` 方法或?qū)ο蟮臉?gòu)造方法。

---

四、繼承體系中的靜態(tài)機(jī)制:父類(lèi)與子類(lèi)的加載順序

當(dāng)存在繼承關(guān)系時(shí),類(lèi)的加載和靜態(tài)代碼塊的執(zhí)行遵循**“先父類(lèi),后子類(lèi)”**的原則。

**代碼示例**:

class Base {
    static {
        System.out.println("base static:父類(lèi)靜態(tài)代碼塊");
    }
    public Base() {
        System.out.println("base constructor:父類(lèi)構(gòu)造方法");
    }
}
public class Test extends Base {
    static {
        System.out.println("test static:子類(lèi)靜態(tài)代碼塊");
    }
    public Test() {
        System.out.println("test constructor:子類(lèi)構(gòu)造方法");
    }
    public static void main(String[] args) {
        new Test();
    }
}

```

**運(yùn)行結(jié)果**:

```

base static:父類(lèi)靜態(tài)代碼塊

test static:子類(lèi)靜態(tài)代碼塊

base constructor:父類(lèi)構(gòu)造方法

test constructor:子類(lèi)構(gòu)造方法

```

**執(zhí)行邏輯解析**:

1. 執(zhí)行 `main` 方法時(shí),JVM 加載 `Test` 類(lèi),發(fā)現(xiàn)它繼承自 `Base` 類(lèi),因此**先加載父類(lèi) `Base`**;

2. 執(zhí)行 `Base` 類(lèi)的靜態(tài)代碼塊,輸出 `base static`;

3. 加載子類(lèi) `Test` 類(lèi),執(zhí)行其靜態(tài)代碼塊,輸出 `test static`;

4. 創(chuàng)建 `Test` 對(duì)象時(shí),**先調(diào)用父類(lèi) `Base` 的構(gòu)造方法**,輸出 `base constructor`;

5. 再調(diào)用子類(lèi) `Test` 的構(gòu)造方法,輸出 `test constructor`。

---

五、靜態(tài)機(jī)制的實(shí)戰(zhàn)應(yīng)用場(chǎng)景

5.1 工具類(lèi)設(shè)計(jì)

靜態(tài)方法適合作為工具類(lèi)的方法,無(wú)需創(chuàng)建對(duì)象即可直接調(diào)用,簡(jiǎn)化使用流程。

**代碼示例(字符串工具類(lèi))**:

public class StringUtil {
    // 靜態(tài)方法:判斷字符串是否為空
    public static boolean isEmpty(String str) {
        return str == null || str.trim().length() == 0;
    }
    // 靜態(tài)方法:字符串轉(zhuǎn)整數(shù),帶默認(rèn)值
    public static int toInt(String str, int defaultValue) {
        if (isEmpty(str)) {
            return defaultValue;
        }
        try {
            return Integer.parseInt(str);
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }
}
// 調(diào)用示例
public class Test {
    public static void main(String[] args) {
        System.out.println(StringUtil.isEmpty("")); // 輸出:true
        System.out.println(StringUtil.toInt("123", 0)); // 輸出:123
        System.out.println(StringUtil.toInt("abc", 0)); // 輸出:0
    }
}

```

5.2 單例模式實(shí)現(xiàn)

靜態(tài)變量可用于實(shí)現(xiàn)“餓漢式”單例模式,保證類(lèi)在內(nèi)存中只有一個(gè)實(shí)例。

**代碼示例**:

public class Singleton {
    // 靜態(tài)變量:類(lèi)加載時(shí)初始化唯一實(shí)例
    private static final Singleton INSTANCE = new Singleton();
    // 私有構(gòu)造方法:防止外部創(chuàng)建對(duì)象
    private Singleton() {}
    // 靜態(tài)方法:提供全局訪問(wèn)點(diǎn)
    public static Singleton getInstance() {
        return INSTANCE;
    }
    // 業(yè)務(wù)方法
    public void doSomething() {
        System.out.println("單例對(duì)象的業(yè)務(wù)邏輯");
    }
}
// 調(diào)用示例
public class Test {
    public static void main(String[] args) {
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance1 == instance2); // 輸出:true(同一實(shí)例)
    }
}

```

---

六、總結(jié):Java 靜態(tài)機(jī)制的核心要點(diǎn)

1. **靜態(tài)變量**:

   - 存儲(chǔ)在方法區(qū)的靜態(tài)常量池,屬于類(lèi),所有對(duì)象共享;

   - 適合存儲(chǔ)全局共享的配置、狀態(tài)等數(shù)據(jù)。

2. **靜態(tài)方法**:

   - 屬于類(lèi),可通過(guò)“類(lèi)名.方法名”直接調(diào)用;

   - 不能訪問(wèn)實(shí)例變量和實(shí)例方法,不能使用 `this` 關(guān)鍵字;

   - 適合作為工具方法、工廠方法、單例訪問(wèn)方法等。

3. **靜態(tài)代碼塊**:

   - 類(lèi)加載時(shí)執(zhí)行,僅執(zhí)行一次;

   - 用于類(lèi)的初始化邏輯,如加載配置、初始化靜態(tài)變量等。

4. **繼承中的靜態(tài)執(zhí)行順序**:

   - 先加載父類(lèi),執(zhí)行父類(lèi)靜態(tài)代碼塊;

   - 再加載子類(lèi),執(zhí)行子類(lèi)靜態(tài)代碼塊;

   - 創(chuàng)建對(duì)象時(shí),先調(diào)用父類(lèi)構(gòu)造方法,再調(diào)用子類(lèi)構(gòu)造方法。

通過(guò)本文的學(xué)習(xí),相信你已對(duì) Java 靜態(tài)機(jī)制的“變量、方法、代碼塊”以及類(lèi)加載順序有了全面理解。靜態(tài)機(jī)制是 Java 類(lèi)級(jí)別的重要特性,合理運(yùn)用靜態(tài)變量、方法和代碼塊,可實(shí)現(xiàn)工具類(lèi)、單例模式等常見(jiàn)設(shè)計(jì),同時(shí)需注意靜態(tài)與非靜態(tài)的訪問(wèn)限制,避免編譯錯(cuò)誤。建議在日常開(kāi)發(fā)中多思考靜態(tài)成員的適用場(chǎng)景,逐步培養(yǎng)對(duì)類(lèi)加載和靜態(tài)初始化邏輯的敏感度,為掌握更復(fù)雜的 Java 底層原理奠定基礎(chǔ)。

到此這篇關(guān)于Java 靜態(tài)機(jī)制:靜態(tài)變量、方法、代碼塊與類(lèi)加載的文章就介紹到這了,更多相關(guān)java精態(tài)變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot集成netty實(shí)現(xiàn)客戶端服務(wù)端交互示例詳解

    Spring Boot集成netty實(shí)現(xiàn)客戶端服務(wù)端交互示例詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot集成netty實(shí)現(xiàn)客戶端服務(wù)端交互的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 基于spring-security 401 403錯(cuò)誤自定義處理方案

    基于spring-security 401 403錯(cuò)誤自定義處理方案

    這篇文章主要介紹了基于spring-security 401 403錯(cuò)誤自定義處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Apache?Commons?Imaging處理圖像實(shí)例深究

    Apache?Commons?Imaging處理圖像實(shí)例深究

    這篇文章主要為大家介紹了Apache?Commons?Imaging處理圖像的實(shí)例探索深究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Java多線程高并發(fā)中解決ArrayList與HashSet和HashMap不安全的方案

    Java多線程高并發(fā)中解決ArrayList與HashSet和HashMap不安全的方案

    ArrayList實(shí)現(xiàn)了可變大小的數(shù)組。它允許所有元素,包括null。ArrayList沒(méi)有同步,HashMap和Hashtable類(lèi)似,不同之處在于HashMap是非同步的,并且允許null,關(guān)于HashSet有一件事應(yīng)該牢記,即就條目數(shù)和容量之和來(lái)講,迭代是線性的,接下來(lái)讓我們?cè)敿?xì)來(lái)了解吧
    2021-11-11
  • springboot 返回json格式數(shù)據(jù)時(shí)間格式配置方式

    springboot 返回json格式數(shù)據(jù)時(shí)間格式配置方式

    這篇文章主要介紹了springboot 返回json格式數(shù)據(jù)時(shí)間格式配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring boot中Jackson的操作指南

    Spring boot中Jackson的操作指南

    這篇文章主要給大家介紹了關(guān)于Spring boot中Jackson操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • SpringBoot利用自定義注解實(shí)現(xiàn)多數(shù)據(jù)源

    SpringBoot利用自定義注解實(shí)現(xiàn)多數(shù)據(jù)源

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何利用自定義注解實(shí)現(xiàn)多數(shù)據(jù)源效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下
    2022-10-10
  • 全面解析@InsertProvider執(zhí)行原理

    全面解析@InsertProvider執(zhí)行原理

    這篇文章主要介紹了全面解析@InsertProvider執(zhí)行原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Spring Boot如何配置內(nèi)置Tomcat的maxPostSize值

    Spring Boot如何配置內(nèi)置Tomcat的maxPostSize值

    這篇文章主要介紹了Spring Boot如何配置內(nèi)置Tomcat的maxPostSize值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • JPA多條件復(fù)雜SQL動(dòng)態(tài)分頁(yè)查詢(xún)功能

    JPA多條件復(fù)雜SQL動(dòng)態(tài)分頁(yè)查詢(xún)功能

    這篇文章主要介紹了JPA多條件復(fù)雜SQL動(dòng)態(tài)分頁(yè)查詢(xún)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

神农架林区| 个旧市| 东台市| 桂东县| 富蕴县| 农安县| 体育| 西安市| 大关县| 沅陵县| 新兴县| 福鼎市| 乌兰察布市| 宁陕县| 夏邑县| 白山市| 宁南县| 盱眙县| 丽江市| 涟水县| 理塘县| 保定市| 新乡县| 彰化市| 丹棱县| 乌海市| 湘潭市| 兴海县| 阿城市| 民县| 扎赉特旗| 红安县| 华坪县| 卢龙县| 龙井市| 广汉市| 华阴市| 宝坻区| 木兰县| 白城市| 庆安县|