java類初始化順序

轉自:http://zangweiren.iteye.com/blog/208122

對于靜態變量、靜態初始化塊、變量、初始化塊、構造器,它們的初始化順序以此是(靜態變量、靜態初始化塊)>(變量、初始化塊)>構造器。我們也可以通過下面的測試代碼來驗證這一點:?Java代碼
??? public class InitialOrderTest {

??????? // 靜態變量
??????? public static String staticField = "靜態變量";
??????? // 變量
??????? public String field = "變量";

??????? // 靜態初始化塊
??????? static {
??????????? System.out.println(staticField);
??????????? System.out.println("靜態初始化塊");
??????? }

??????? // 初始化塊
??????? {
??????????? System.out.println(field);
??????????? System.out.println("初始化塊");
??????? }

??????? // 構造器
??????? public InitialOrderTest() {
??????????? System.out.println("構造器");
??????? }

??????? public static void main(String[] args) {
??????????? new InitialOrderTest();
??????? }
??? }


??? 運行以上代碼,我們會得到如下的輸出結果:
??? 靜態變量
??? 靜態初始化塊
??? 變量
??? 初始化塊
??? 構造器
??? 這與上文中說的完全符合。

?

那么對于繼承情況下又會怎樣呢?我們仍然以一段測試代碼來獲取最終結果: Java代碼
??? class Parent {
??????? // 靜態變量
??????? public static String p_StaticField = "父類--靜態變量";
??????? // 變量
??????? public String p_Field = "父類--變量";

??????? // 靜態初始化塊
??????? static {
??????????? System.out.println(p_StaticField);
??????????? System.out.println("父類--靜態初始化塊");
??????? }

??????? // 初始化塊
??????? {
??????????? System.out.println(p_Field);
??????????? System.out.println("父類--初始化塊");
??????? }

??????? // 構造器
??????? public Parent() {
??????????? System.out.println("父類--構造器");
??????? }
??? }

??? public class SubClass extends Parent {
??????? // 靜態變量
??????? public static String s_StaticField = "子類--靜態變量";
??????? // 變量
??????? public String s_Field = "子類--變量";
??????? // 靜態初始化塊
??????? static {
??????????? System.out.println(s_StaticField);
??????????? System.out.println("子類--靜態初始化塊");
??????? }
// 初始化塊
??????? {
??????????? System.out.println(s_Field);
??????????? System.out.println("子類--初始化塊");
??????? }

??????? // 構造器
??????? public SubClass() {
??????????? System.out.println("子類--構造器");
??????? }

??????? // 程序入口
??????? public static void main(String[] args) {
??????????? new SubClass();
??????? }
??? }


???? 運行一下上面的代碼,結果馬上呈現在我們的眼前:
??? 父類--靜態變量
??? 父類--靜態初始化塊
??? 子類--靜態變量
??? 子類--靜態初始化塊
??? 父類--變量
??? 父類--初始化塊
??? 父類--構造器
??? 子類--變量
??? 子類--初始化塊
??? 子類--構造器
??? 現在,結果已經不言自明了。大家可能會注意到一點,那就是,并不是父類完全初始化完畢后才進行子類的初始化,實際上子類的靜態變量和靜態初始化塊的初始化是在父類的變量、初始化塊和構造器初始化之前就完成了。 那么對于靜態變量和靜態初始化塊之間、變量和初始化塊之間的先后順序又是怎樣呢?是否靜態變量總是先于靜態初始化塊,變量總是先于初始化塊就被初始化了呢?實際上這取決于它們在類中出現的先后順序。我們以靜態變量和靜態初始化塊為例來進行說明。 同樣,我們還是寫一個類來進行測試: Java代碼
??? public class TestOrder {
??????? // 靜態變量
??????? public static TestA a = new TestA();

??????? // 靜態初始化塊
??????? static {
??????????? System.out.println("靜態初始化塊");
??????? }

??????? // 靜態變量
??????? public static TestB b = new TestB();

??????? public static void main(String[] args) {
??????????? new TestOrder();
??????? }
??? }

??? class TestA {
??????? public TestA() {
??????????? System.out.println("Test--A");
??????? }
??? }

??? class TestB {
??????? public TestB() {
??????????? System.out.println("Test--B");
??????? }
??? }


???? 運行上面的代碼,會得到如下的結果:
??? Test--A
??? 靜態初始化塊
??? Test--B
??? 大家可以隨意改變變量a、變量b以及靜態初始化塊的前后位置,就會發現輸出結果隨著它們在類中出現的前后順序而改變,這就說明靜態變量和靜態初始化塊是依照他們在類中的定義順序進行初始化的。同樣,變量和初始化塊也遵循這個規律。 了解了繼承情況下類的初始化順序之后,如何判斷最終輸出結果就迎刃而解了。

轉載于:https://www.cnblogs.com/limingluzhu/archive/2012/09/06/2673197.html

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

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

相關文章

Java 8 - Interface Default Method接口默認方法

Java 8 相比于Java 7 推出了幾大特色(features)(接口默認方法)default methods in interface, (接口靜態方法)static method in interface, 函數編程(functional programming), lamda expression, stream API.這里首先…

Windows 11下 WSL使用 jupyter notebook

這里寫目錄標題前言在WSL下的配置測試運行更優雅的啟動方法配置jupyter生成默認配置文件生成秘鑰修改配置文件nohup啟動前言 一直都使用jupyter notebook,不管做數據分析,還是調試代碼,還有寫文章都是。但是好像在WSL下又不好使。看了網上有…

sql2000導出mysql_如何將sql2000的數據庫導入到mysql中?

展開全部先用SQl2000導出e68a843231313335323631343130323136353331333262373366文本文件,把后綴名改為CSv,再從Mysql中一導入OK參考:第一種是安裝mysql ODBC,利用sql server的導出功能,選擇mysql數據源,進…

實現日、周、月排行統計 sql

在如今很多系統中,都需要進行日、周、月排行統計,但是在網上尋找 了一番,發現很多都是相對的周、月排行,即周排行則用當前時間減去7天。這樣我個人認為并不恰當。如月排行中,假設今天是4月22日,則從3月22日至4月22日之…

產品運行所需的信息檢索失敗_為服務業注入新活力,華北工控推出服務機器人專用計算機產品方案...

近年來,隨著人口老齡化趨勢加快和信息科技革命的持續推進,服務機器人已經被當作社會勞動力的一部分在醫療、教育、餐飲等行業廣泛應用,市場潛力巨大。01、需求帶動消費,科技改變服務服務機器人是國內智能機器人產業發展最快的分支…

Windows更新沒有更新提示:從windows 10升級到Windows 11,并WSL下配置cuda

文章目錄從windows 10 升級到Windows 11安裝WSL的安裝配置cuda從windows 10 升級到Windows 11 升級的方法有很多種,各大網站都有。有更新提示的按更新提示操作即可。我的是一直都沒有更新提示,也搜索過網上的一些方法,但都不行。還是沒法更新…

js修改css樣式屬性_這個筆記《CSS樣式的常見屬性及值》,讓菜鳥輕松學會包粽子...

常見樣式屬性及值字體:font-family-size-style: normal(正常)|italic(傾斜)|oblique-weight: normal|bold(粗體)如果組合起來編寫: font: style weight size family字體大小的單位可以是 px, em, rem, pt, cm, mm, in, pc文本:colortext-align(水平對齊方式): left|center|righ…

7.java.lang.IllegalAccessException

java.lang.IllegalAccessException 沒有訪問權限 當應用程序要調用一個類,但當前的方法即沒有對該類的訪問權限便會出現這個異常。對程序中用了Package的情況下要注意這個異常

在 VirtualBox 中 CentOS 網絡設置

轉自&#xff1a;本文發表于水景一頁。永久鏈接&#xff1a;<http://cnzhx.net/blog/minimal-centos-in-virtualbox/>。轉載請保留此信息及相應鏈接。 4. 設置 按照上面的方法安裝之后&#xff0c;還需要一些簡單的設置&#xff0c;比如網絡訪問。然后既然是做網頁服務器…

mysql 熱塊_mysql 優化

數據庫層面&#xff1a;應用系統層面優化SQL優化SQL優化一般通過分析慢查詢日志來抓取長事務高消耗的sql&#xff0c;通過結合具體業務&#xff0c;對sql邏輯進行分析and精簡&#xff0c;or重寫sql。通過配置slow_query_log1和log_queries_not_using_indexes1啟動慢查詢日志記錄…

vscode C++ 分文件、文件夾編譯配置與錯誤解決

文章目錄問題includesourceout配置過程遇到的問題與解決遇到的問題1解決步驟1. ctrl shift p2. 配置json文件修改task.json文件修改launch.json可能遇到的錯誤1. collect2: error: ld returned 1 exit status2. /mnt/d/tmp/c/source/add.cpp:3:10: fatal error: add.h: No su…

gc就是fullgc嗎 major_線上出現fullgc問題如何排查?

1.問題描述線上出現fullgc報警&#xff0c;每5分鐘一次2.背景知識1. 程序執行了System.gc()執行了jmap -histo:live pid命令 在執行minor gc的時候進行的一系列檢查 執行Minor GC的時候&#xff0c;JVM會檢查老年代中最大連續可用空間是否大于了當前新生代所有對象的總大小。 …

修改 jquery.validate.js 支持非form標簽

嘗試使用markdown來寫一篇blog&#xff0c;啦啦啦 源代碼傳送門&#xff1a;github 在特殊情況下我們使用jquery.validate.js對用戶輸入的內容做驗證的時候&#xff0c;表單并不是一定包含在form之中&#xff0c;有可能是一個div彈層&#xff0c;有可能是嵌套在form里面的一個d…

Linux常用文件和目錄操作

cd:變換目錄pwd:顯示弼前目錄mkdir:建立一個新目錄rmdir:刪除一個空目錄 cp&#xff1a;復制目錄或者文件 mv&#xff1a;移動文件或者目錄 rm&#xff1a;刪除文件或者目錄 轉載于:https://www.cnblogs.com/lijingpeng/archive/2012/09/07/2675982.html

淘淘商城項目mysql服務器_SpringMVC+Spring+Mybatis+Mysql+Maven+Svn[ 淘淘商城項目環境搭建 ]...

背景&#xff1a;淘淘商城項目的環境搭建說明&#xff1a;采用SpringMVCSpringMybatisMysqlMavenSvn結構搭建&#xff0c;在開發之中可以參考其結構和搭建步驟去搭建實際的工程項目工程結構簡圖&#xff1a;項目結構&#xff1a;---------------------------------------------…

bean validation校驗方法參數_項目啟動時首先校驗Spring Boot配置參數

1. 概述在項目實際開發過程中&#xff0c;為了更好的復用&#xff0c;我們參考Spring Boot Starters&#xff0c;封裝了許多企業內部中間件的starter。這些中間件的接入都需要申請并在項目中配置一些特定的參數。我們通過ConfigurationProperties注解&#xff0c;增加了在配置過…

進一步理解:inline-block,vertical-align,line-height

看似三個最常見的概念背后卻隱藏了很深的很深“水” 那有多深呢&#xff0c;先來看下面的代碼 引出問題 <style>.inline-block {display: inline-block;}.border {border: 1px solid #000000;}.span {width: 100px;height: 100px;}.bak {background: #33CCFF;} .o-hidden…

刷系統——黑屏問題

引用&#xff1a;http://www.miui.com/thread-344361-1-1.html 此貼大部分內容源自魔趣論壇V大的帖子&#xff0c;本人經過整理后發出&#xff0c;特此聲明原帖地址&#xff1a;http://bbs.mfunz.com/thread-172610-1-1.html——此貼獻給小白們&#xff0c;老鳥一笑而過吧近期有…

LeetCode OJ - Recover Binary Search Tree

題目&#xff1a; Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing its structure. Note:A solution using O(n) space is pretty straight forward. Could you devise a constant space solution? 解題思路&#xff…

mysql中間件是運維工作內容_linux運維工作的七項內容

一&#xff0c;【基礎運維檢查】或叫 例行檢查 或叫 例行巡檢mail cacti1.理解例行檢查列表的內容、檢查項的含義以及可能引發的問題。2.按照例行檢查表&#xff0c;定期檢查系統狀態&#xff0c;發現異常立即通報并推進解決。3.定期檢查線上服務模塊&#xff0c;排除可疑進程,…