[轉載] Java中靜態成員變量,靜態代碼塊,靜態內部類何時被初始化?

參考鏈接: Java中的初始化程序塊Initializer Block

關于這個問題,本文不扯理論,直接上代碼,通過結果來驗證結論,廢話少說,測試代碼如下:?

public class StaticTest {

?

? ? public static StaticMember staticMember = new StaticMember();

?

? ? static {

? ? ? ? System.out.println("static code initializer ");

? ? }

?

? ? private static class InnerClass {

? ? ? ? private static StaticTest staticTest = new StaticTest("load from InnerClass");

? ? }

?

? ? public StaticTest() {

? ? }

?

? ? public StaticTest(String a) {

? ? ? ? System.out.println(a);

? ? }

?

? ? public static void f(){

?

? ? }

?

? ? public void d(){

?

? ? }

?

? ? public static void e(){

? ? ? ? InnerClass.staticTest.d();

? ? }

}?

public class StaticMember {

? ? public StaticMember(){

? ? ? ? System.out.println("StaticMember");

? ? }

}?

在StaticTest 測試類中我寫了三種靜態域分別是靜態成員變量,靜態代碼塊以及靜態內部類,下面通過不同的case測試上面三種靜態域何時被初始化。? 測試case代碼:?

public class Main {

? ? static boolean flg;

?

? ? public static void main(String[] args) {

?

? ? ? ? /**case1**/

? ? ? ? //不會執行靜態代碼塊, 靜態成員變量不會初始化, 也不會加載靜態內部類

? ? ? ? String simpleName = StaticTest.class.getSimpleName();

?

? ? ? ? /**case2**/

? ? ? ? //會執行靜態代碼塊, 靜態成員變量會初始化, 不會加載靜態內部類

? ? ? ? //輸出 StaticMember

? ? ? ? //? ? static code initializer

? ? ? ? StaticMember staticMember = StaticTest.staticMember;

?

? ? ? ? /**case3**/

? ? ? ? //會執行靜態代碼塊, 靜態成員變量會初始化, 不會加載靜態內部類

? ? ? ? //輸出 StaticMember

? ? ? ? //? ? static code initializer

? ? ? ? new StaticTest();

?

? ? ? ? /**case4**/

? ? ? ? //會執行靜態代碼塊, 靜態成員變量會初始化, 不會加載靜態內部類

? ? ? ? //輸出 StaticMember

? ? ? ? //? ? static code initializer

? ? ? ? StaticTest.f();

?

? ? ? ? /**case5**/

? ? ? ? //不會執行靜態代碼塊, 靜態成員變量不會初始化, 也不會加載靜態內部類

? ? ? ? if (flg) {

? ? ? ? ? ? test();

? ? ? ? }

?

? ? ? ? /**case6**/

? ? ? ? //會執行靜態代碼塊, 靜態成員變量會初始化, 同時加載靜態內部類

? ? ? ? // 輸出:StaticMember

? ? ? ? //? ? ? static code initializer

? ? ? ? //? ? ? load from InnerClass

? ? ? ? StaticTest.e();

? ? }

?

? ? private static void test(){

? ? ? ? StaticTest.f();

? ? ? ? StaticTest.e();

? ? }

?

}?

通過上面每一種代碼測試case的輸出結果,可以得出如下結論:?

靜態成員變量和靜態代碼塊(static{})只有在類被調用的時候才會初始化。? 這里是指在運行時真正被使用到才會被初始化,如果是在編譯時被使用到,但在運行時沒有使用到也不會被初始化,比如上面的case5。靜態內部類只有當被外部類調用到的時候才會初始化。? 這里也是指在運行時,也就是說不在于你在編輯器中有沒有寫調用的代碼,而是你寫的這段調用代碼運行時是否會被真正執行到。在只使用了外部類,但是沒有使用內部類的情況下,內部類里面的東西不會被初始化。?

關于case1的情況,直接引用StaticTest.class不會初始化靜態變量和靜態代碼塊,而直接new StaticTest()就會,為什么呢?因為JVM在加載類的過程中分為五個階段:加載、驗證、準備、解析、初始化,StaticTest.class的方式發生在第一個階段,這個階段會在Java堆中創建java.lang.Class的實例,而變量和靜態塊是發生在最后一個初始化的階段,具體參考:Java虛擬機 類加載的過程, Chapter 5. Loading, Linking, and Initializing

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540298.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540298.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540298.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mikrotik dhcp server

操作路徑: /ip dhcp-server 關聯操作: /ip pool屬性 述 dhcp server interface (名稱) – 選擇 DHCP 服務的網絡接口 dhcp address space (IP 地址/掩碼; 默認: 192.168.0.0/24) – DHCP 服務器將出租給客戶端的網絡地 址段 gateway (IP 地址; 默認: 0.0.0.0) – 分配給客戶端的…

[轉載] Java static關鍵字與static{}語句塊

參考鏈接: Java中的靜態塊static block 目錄直通車 一、 類的加載特性與時機 1、 類加載的特性 2、 類加載的時機 二、 static的三個常用 1、 修飾成員變量 2、 修飾成員方法 3、 靜態塊(static{}) 一、 類的加載特性與時機 …

Perl文件讀寫操作

本文轉自 tiger506 51CTO博客,原文鏈接:http://blog.51cto.com/tiger506/830771,如需轉載請自行聯系原作者

[轉載] Java 語言中的實例初始化塊 ( IIB) 詳解

參考鏈接: Java中的實例初始化塊(IIB) 在 Java 語言中的類初始化塊 文章中我們簡單的介紹了下 Java 中的實例初始化塊 ( IIB )。不過我覺得介紹的有點簡單了,于是,再寫一篇文章詳細介紹下吧。 Java 語言中,存在三種操作&#x…

不用正則表達式,用javascript從零寫一個模板引擎(一)

前言 模板引擎的作用就是將模板渲染成html,html render(template,data),常見的js模板引擎有Pug,Nunjucks,Mustache等。網上一些制作模板引擎的文章大部分是用正則表達式做一些hack工作,看完能收獲的東西很少。本文將使用編譯原理那套理論來打…

[轉載] Java靜態綁定與動態綁定

參考鏈接: Java中的靜態綁定與動態綁定 程序綁定的概念: 綁定指的是一個方法的調用與方法所在的類(方法主體)關聯起來。對java來說,綁定分為靜態綁定和動態綁定;或者叫做前期綁定和后期綁定. 靜態綁定: 在程序執行前方…

關于批量插入數據之我見(100萬級別的數據,mysql)

2019獨角獸企業重金招聘Python工程師標準>>> 因前段時間去面試,問到如何高效向數據庫插入10萬條記錄,之前沒處理過類似問題,也沒看過相關資料,結果沒答上來,今天就查了些資料,總結出三種方法&am…

各個OS關于查看磁盤和wwn號的方法

1,HP-UX幾個命令1)查看型號,和uname -a差不多model2)查看光纖卡信息ioscan -funC fc3) 查看掃描出的磁盤信息ioscan -fucC disk4)查看磁盤及其對應的路徑ioscan -m dsf5) 查看劃分過來的lunioscan -m lun6) 查看磁盤大小diskinfo …

[轉載] Java是不是面向對象的程序

參考鏈接: 為什么Java不是純粹的面向對象語言 轉載自:https://blog.csdn.net/a21700790yan/article/details/80129053 Java——是否確實的 “純面向對象”?讓我們深入到Java的世界,試圖來證實它。 在我剛開始學習 Java 的前面幾…

極速理解設計模式系列:6.適配器模式(Adapter Pattern)

四個角色:目標抽象類角色(Target)、目標對象角色(Adapter)、源對象角色(Adaptee)、客戶端角色(Client) 目標抽象類角色(Target):定義需要實現的目標接口 目標對象角色(Adapter):調用另外一個源對象,并且轉換…

[轉載] Java之繼承

參考鏈接: Java多重繼承 Java之繼承 繼承是面向對象程序的一個基本特征,通過繼承可以實現父子關系,以及代碼的復用。通過繼承實現的類稱為子類,被繼承的類稱為父類,所有直接或間接被繼承的類都稱為父類。 Java類體…

Spark(二): 內存管理

2019獨角獸企業重金招聘Python工程師標準>>> Spark 作為一個以擅長內存計算為優勢的計算引擎,內存管理方案是其非常重要的模塊; Spark的內存可以大體歸為兩類:execution和storage,前者包括shuffles、joins、sorts和agg…

[轉載] 手把手教你整合最優雅SSM框架:SpringMVC + Spring + MyBatis

參考鏈接: Java繼承類的對象創建 本文發表于2016年6月,寫于作者學生時期。文中使用到的技術和框架可能不是當下最佳實踐,甚至很不“優雅”。但對于剛接觸JavaEE和Spring的同學來說,還是能有很多收獲的,大牛輕拍 我們…

多播、組播、廣播優缺點分析

2019獨角獸企業重金招聘Python工程師標準>>> 單播、多播和廣播單播”(Unicast)、“多播”(Multicast)和“廣播”(Broadcast)這三個術語都是用來描述網絡節點之間通訊方式的術語。那么這些術語究…

[轉載] Java重載、覆蓋與構造函數

參考鏈接: Java中的繼承和構造函數 /** * 拷貝構造函數---Copyf t2 new Copyf(t1);就不會在調用默認構造函數了。 * 復制clone和引用 * 重載是在同一個類(范圍)中,覆蓋是子類對父類而言。 重載不關心返回值類型。 靜態方法不能被…

LOFTERD18B542F16FF685FD684F427B4…

2019獨角獸企業重金招聘Python工程師標準>>> 驗證 轉載于:https://my.oschina.net/jinhengyu/blog/1572124

[轉載] Java獲取一個類繼承的父類或者實現的接口的泛型參數

參考鏈接&#xff1a; Java中的接口和繼承 泛型的作用就不多介紹了&#xff0c;如果你想具備架構設計能力&#xff0c;那么熟練使用泛型是必不可少的。 不多說了&#xff0c;先定義泛型父類和泛型接口&#xff1a; package cn.zhh; public class Parent<T1, T2> { …

PHP系列(一)PHP流程控制結構

while(){} do{ }while(); for( 表達式1; 表達式2;表達式3 ){ 語句或語句序列; } if(){} if(){ }elseif{} <?php $i0; while(true) { if($i>100) break; echo ".$i.<br>"; $i; } ?> <?php echo "<table border1800>"; echo &quo…

[轉載] Scala繼承與Java的區別

參考鏈接&#xff1a; Java中將final與繼承一起使用 在之前的筆記Java靜態屬性和方法的繼承問題中&#xff0c;通過具體的實驗證明&#xff0c;在子類中重寫父類的字段時并沒有覆蓋父類的字段&#xff0c;只是隱藏了父類的字段。而在scala中則不同&#xff0c;scala子類的同名…

Source Map調試壓縮后代碼

在前端開發過程中&#xff0c;無論是樣式還是腳本&#xff0c;運行時的文件可能是壓縮后的&#xff0c;那這個時候調試起來就很麻煩。 這個時候&#xff0c;可以使用Source Map文件來優化調試&#xff0c;Source Map是一個信息文件&#xff0c;里面儲存著原代碼位置信息&#x…