Java類初始化順序

jvm系列

  • 垃圾回收基礎

  • JVM的編譯策略

  • GC的三大基礎算法

  • GC的三大高級算法

  • GC策略的評價指標

  • JVM信息查看

  • GC通用日志解讀

  • jvm的card table數據結構

  • Java類初始化順序

  • Java對象結構及大小計算

  • Java的類加載機制

  • Java對象分配簡要流程

  • 年老代過大有什么影響

  • Survivor空間溢出實例

  • 關于Object=null

  • Java線程與Xss

本文主要演示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();}
}

輸出

運行以上代碼,我們會得到如下的輸出結果:

  1. 靜態變量

  2. 靜態初始化塊

  3. 變量

  4. 初始化塊

  5. 構造器

繼承的情況

實例代碼

class Parent {/* 靜態變量 */public static String p_StaticField = "父類--靜態變量";/* 變量 */public String    p_Field = "父類--變量";protected int    i    = 9;protected int    j    = 0;/* 靜態初始化塊 */static {System.out.println( p_StaticField );System.out.println( "父類--靜態初始化塊" );}/* 初始化塊 */{System.out.println( p_Field );System.out.println( "父類--初始化塊" );}/* 構造器 */public Parent(){System.out.println( "父類--構造器" );System.out.println( "i=" + i + ", j=" + j );j = 20;}
}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( "子類--構造器" );System.out.println( "i=" + i + ",j=" + j );}/* 程序入口 */public static void main( String[] args ){System.out.println( "子類main方法" );new SubClass();}
}

輸出

父類--靜態變量
父類--靜態初始化塊
子類--靜態變量
子類--靜態初始化塊
子類main方法
父類--變量
父類--初始化塊
父類--構造器
i=9, j=0
子類--變量
子類--初始化塊
子類--構造器
i=9,j=20

子類的靜態變量和靜態初始化塊的初始化是在父類的變量、初始化塊和構造器初始化之前就完成了。靜態變量、靜態初始化塊,變量、初始化塊初始化了順序取決于它們在類中出現的先后順序。

分析

  • (1)訪問SubClass.main(),(這是一個static方法),于是裝載器就會為你尋找已經編譯的SubClass類的代碼(也就是SubClass.class文件)。在裝載的過程中,裝載器注意到它有一個基類(也就是extends所要表示的意思),于是它再裝載基類。不管你創不創建基類對象,這個過程總會發生。如果基類還有基類,那么第二個基類也會被裝載,依此類推。

  • (2)執行根基類的static初始化,然后是下一個派生類的static初始化,依此類推。這個順序非常重要,因為派生類的“static初始化”有可能要依賴基類成員的正確初始化。

  • (3)當所有必要的類都已經裝載結束,開始執行main()方法體,并用new SubClass()創建對象。

  • (4)類SubClass存在父類,則調用父類的構造函數,你可以使用super來指定調用哪個構造函數。基類的構造過程以及構造順序,同派生類的相同。首先基類中各個變量按照字面順序進行初始化,然后執行基類的構造函數的其余部分。

  • (5)對子類成員數據按照它們聲明的順序初始化,執行子類構造函數的其余部分。

類初始化

public class ClinitDemo {/*** 父類中定義的靜態語句塊要優于子類的變量賦值操作* JVM保證一個類的clinit方法在多線程中被正確加鎖、同步*/static class Parent {public static int A = 1;static {A = 2;}}static class Sub extends Parent {public static int B = A;}public static void main(String[] args) {System.out.println(Sub.B);}}

輸出2

static變量

public class Test {                                         static {                                                i = 0;  //  給變量復制可以正常編譯通過                           
//        System.out.print(i);  // 這句編譯器會提示“非法向前引用”         }                                                       static int i = 1;                                       static int j = 1;                                       static{                                                 j = 2;                                              }                                                       public static void main(String[] args){                 System.out.println(Test.i);  //1                    System.out.println(Test.j); //2                     }                                                       
}                                                           

不觸發初始化實例

實例一二

/*** 被動使用類字段演示一:* 通過子類引用父類的靜態字段,不會導致子類初始化**/
class SuperClass {static {System.out.println("SuperClass init!");}public static int value = 123;
}class SubClass extends SuperClass {static {System.out.println("SubClass init!");}
}/*** 非主動使用類字段演示**/
public class NotInitialization {public static void main(String[] args) {
//        System.out.println(SubClass.value);
//SuperClass init!
//123/*** 被動使用類字段演示二:* 通過數組定義來引用類,不會觸發此類的初始化**/SuperClass[] sca = new SuperClass[10];}

實例三

/*** 被動使用類字段演示三:** 常量在編譯階段會存入調用類的常量池中,本質上沒有直接引用到定義常量的類,* 因此不會觸發定義常量的類的初始化。**/
public class ConstClass {static {System.out.println("ConstClass init!");}public static final String HELLOWORLD = "hello world";
}
public class Test {public static void main(String[] args){System.out.println(ConstClass.HELLOWORLD);}
}

輸出

hello world

這里沒有初始化ConstClass類,是因為在編譯的時候,常量(static final 修飾的)會存入調用類的常量池【這里說的是main函數所在的類的常量池】,調用的時候本質上沒有引用到定義常量的類,而是直接訪問了自己的常量池。

參考

  • java類的初始化順序(引了大半)

  • Java類加載的時機

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

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

相關文章

Actionbarsherlock Demo 淺析 :Overlay

讓Actionbar處于覆蓋模式,當Activity需要顯示大量滾動的內容,尤其是包含圖片內容的時候,Overlay模式非常有效。 requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);//將Actionbar設置為Overlay模式。 getSupportActionBar().setBackg…

java中 怎么獲取bean_java普通類如何得到spring中的bean類

在SSH集成的前提下。某些情況我們需要在Action以外的類中來獲得Spring所管理的Service對象。之前我在網上找了好幾好久都沒有找到合適的方法。例如:ApplicationContext context new ClassPathXmlApplicationContext();當時我覺得沒有這個必要,浪費內存。…

淺析C#中構建多線程應用程序

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** 引言 1.理解多線程 2. 線程異步與線程同步 3.創建多線程應用程序 3.1通過System.Threa…

58同城高性能移動Push推送平臺架構演進之路

2019獨角獸企業重金招聘Python工程師標準>>> 本文詳細講述58同城高性能移動Push推送平臺架構演進的三個階段,并介紹了什么是移動Push推送,為什么需要,原理和方案對比;移動Push推送第一階段(單平臺&#xff…

Android Studio 插件

https://plugins.jetbrains.com/?androidstudio轉載于:https://www.cnblogs.com/xiaoyao095/p/4712552.html

resin指定java版本_resin的幾個常用配置

本文著重介紹resin的幾個常用配置注:1. 本文并非resin.conf的使用說明,只是從實用角度出發,按需分析常用的配置。更多的內容到官網學習吧;2. 基于resin3.x的探討。(友情提示:剛下載的resin中,resin.conf里的…

Android生命周期函數執行順序

轉載自:http://blog.csdn.net/intheair100/article/details/39061473 程序正常啟動:onCreate()->onStart()->onResume(); onCreate之后就會執行onStart,此時畫面已經顯示出來了,但還不能交互;然后執行onResume,此時可以與用…

hdoj-2028-Lowest common multiple plus

題目&#xff1a;Lowest common multiple plus 代碼&#xff1a; #include<stdio.h> int common(int a,int b)//計算最大公約數 {int ca%b,t0;if(b>a){tb;ba;at;}while(a%b!0){ca%b;ab;bc;}return b; } int q[105]; int main() {int n,i,j,t0;while(scanf("%d&qu…

C#系統命名空間

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 一、基礎命名空間 System.Collections 包含了一些與集合相關的類型,比如列表,隊列,位數…

java不規則算法_分布式id生成算法 snowflake 詳解

背景在復雜分布式系統中&#xff0c;往往需要對大量的數據和消息進行唯一標識。如在支付流水號、訂單號等&#xff0c;隨者業務數據日漸增長&#xff0c;對數據分庫分表后需要有一個唯一ID來標識一條數據或消息&#xff0c;數據庫的自增ID顯然不能滿足需求&#xff0c;此時一個…

Android中下載、安裝和卸載(原)

應用場景&#xff1a;在檢查版本更新的時候經常需要從服務器端下載然后安裝到手機中 使用工具&#xff1a; XUtils&#xff0c;這個開源的框架真的是需要花大把時間去閱讀和理解的&#xff0c;十分有用的&#xff0c;on the way &#xff01; fighting&#xff01; 下載&#x…

Android加載圖片OOM錯誤解決方式

前幾天做項目的時候&#xff0c;甲方要求是PAD &#xff08;SAMSUNG P600 10.1寸 2560*1600&#xff09;的PAD上顯示高分辨率的大圖片。 SQLITE採用BOLD方式存儲圖片&#xff0c;這個存取過程就不說了哈&#xff0c;網上一大堆。 可是在加載/讀取/顯示圖片的時候會報OOM錯誤&am…

C# 對Ini文件操作(C# ini文件操作類)

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** /* C# 對Ini文件操作&#xff08;C# ini文件操作類&#xff09; [IniFiles.cs] 蝶曉…

python對文件進行讀寫操作

2019獨角獸企業重金招聘Python工程師標準>>> python進行文件讀寫的函數是open或file file_handler open(filename,,mode&#xff09; Table mode 模式描述r以讀方式打開文件&#xff0c;可讀取文件信息。w以寫方式打開文件&#xff0c;可向文件寫入信息。如文件存在…

android:contentDescription

android:contentDescription這個屬性相信大家并不陌生&#xff0c;在ImageButton的使用過程中如果不添加這個屬性會有警告信息。 那么android:contentDescription究竟是干什么的呢&#xff1f;今天查了下資料才知道這個屬性的真正作用。 該屬性為視力障礙的用戶提供方便&#x…

c#中bin,obj,properties文件夾的作用

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** Bin目錄用來存放編譯的結果&#xff0c;bin是二進制binrary的英文縮寫&#xff0c;因為…

getAttribute實例例java_Java ExifInterface.getAttribute方法代碼示例

import android.media.ExifInterface; //導入方法依賴的package包/類public static void copyExif(ExifInterface originalExif, int width, int height, String imageOutputPath) {String[] attributes new String[]{ExifInterface.TAG_APERTURE,ExifInterface.TAG_DATETIME,…

檢測SDWebImage有沒有緩存圖片 IOS 獲取網絡圖片大小

判斷圖片是否緩存NSURL *url [NSURL URLWithString:[model.content objectForKey:"image"]];//請求網絡地址數據的同步方法//因為這個方法在子線程(全局隊列)中執行,所以不需要考慮死線程的問題SDWebImageManager *manager [SDWebImageManager sharedManager];[man…

mac 下 使用 java運行 class 文件 總是提示 “錯誤: 找不到或無法加載主類”的解決方法...

發現問題 切換到mac平臺后&#xff0c;突然想寫點程序運行在mac下&#xff0c;想到mac自帶java&#xff0c;會方便好多。不過在這過程中遇到了麻煩&#xff1a; 總是提示 “錯誤: 找不到或無法加載主類” 工程結構 查了好久&#xff0c;終于找到原型所在&#xff0c;發現網上很…

[轉]VisualStudio如何組織解決方案的目錄結構

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 解決方案與項目&#xff1a; 從VC6之后VC系列就使用解決方案&#xff08;Solution&…