欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java類初始化順序詳解

 更新時間:2023年08月14日 09:11:25   作者:不打魔獸的少年  
這篇文章主要介紹了Java類初始化順序詳解,java語言在使用過程中最先開始就是初始化,在工作中如果遇到什么問題需?要定位往往到最后也可能是初始化的問題,因此掌握初始化的順序很重要,需要的朋友可以參考下

Java 類初始化介紹

java語言在使用過程中最先開始就是初始化,在工作中如果遇到什么問題需 要定位往往到最后也可能是初始化的問題,因此掌握初始化的順序很重要。

根據(jù)java 語言特性,本人針對初始化中常遇到的一些關(guān)鍵點做了總結(jié),當(dāng)然是基于代碼之上的,主要針對JVM加載一個類之后,類的屬性等在內(nèi)存中的初始化,主要靜態(tài)的變量和非靜態(tài)的變量,以及靜態(tài)代碼塊,普通代碼塊等。具體參考下面的圖:

這里寫圖片描述

簡單介紹下圖的意思,java類對象初始化主要包括:

  • 靜態(tài)基本變量;
  • 靜態(tài)類變量;
  • 靜態(tài)代碼塊;
  • 普通基本變量;
  • 普通類類型變量;
  • 普通代碼塊;
  • 構(gòu)造方法;

初始化的時候主要就是這些屬性,但是該類繼承自父類,則初始化順序號包括基類的這些屬性,即初始化屬性包括本類的這些屬性+父類的這些屬性,并且基類的屬性和本類的屬性交叉初始化。

無繼承關(guān)系初始化

首先查看基本代碼

首先看TestB.java類

private  static String tag = "TestB";
//靜態(tài)變量
private static int  staticVarA = initVar("staticVarA");
//靜態(tài)代碼塊
static{
    initVar("static init block ");
}
//普通變量
private  int normalA = initVar("normalA");
// 普通代碼塊
{
    initVar("normal init block");
}
public TestB(){
    System.out.println(initVar("constructor"));
}
static int initVar(String str){
    System.out.println(tag +" "+str);
    return 2018;
}

其次是 JavaInitWithMain.java 類

private  static String tag = "JavaInitWithMain";
//靜態(tài)變量
private static int  staticVarA = initVar("staticVarA");
//靜態(tài)代碼塊
static{
    initVar("static init block ");
}
//普通變量
private  int normalA = initVar("normalA");
// 普通代碼塊
{
    initVar("normal init block");
}
private static TestB nB = new TestB();
private TestB nb2 = new TestB();
public JavaInitWithMain(){
    System.out.println(initVar("constructor"));
}
static int initVar(String str){
    System.out.println(tag +" "+str);
    return 2020;
}
public static void main(String[] args) {
    System.out.println("-------main method-------");
    System.out.println("do nothing");
}

接下來是運行結(jié)果:

這里寫圖片描述

結(jié)果分析:

代碼很簡單,分別在2個類中的基本屬性,在JavaInitWithMain 類中的main方法中不做任何操作,查看結(jié)果。

根據(jù)結(jié)果可知,JVM加載了JavaInitWithMain類之后初始化了該類的屬性,順序是 靜態(tài)的—>非靜態(tài)的—->構(gòu)造方法,靜態(tài)的包括靜態(tài)的基本變量,靜態(tài)的類類型變量,靜態(tài)代碼塊,這三個的順序是 程序員的書寫順序。

得出結(jié)論:無繼承關(guān)系時的初始化順序 靜態(tài)屬性(靜態(tài)基本變量,靜態(tài)類類型變量,靜態(tài)代碼塊)—>非靜態(tài)的屬性(基本類型變量,基本類類型變量,基本代碼塊)—>構(gòu)造方法

存在繼承關(guān)系的初始化

類基本不變,增加TestB的子類TheSonofTestB,如下

public class TheSonofTestB extends TestB {
private  static String tag = "TheSonofTestB";
//靜態(tài)變量
private static int  staticVarA = initVar("staticVarA");
//靜態(tài)代碼塊
static{
    initVar("static init block ");
}
//普通變量
private  int normalA = initVar("normalA");
// 普通代碼塊
{
    initVar("normal init block");
}
public TheSonofTestB(){
    System.out.println(initVar("constructor"));
}
static int initVar(String str){
    System.out.println(tag +" "+str);
    return 2019;
}
}

JavaInitWithMain中增加靜態(tài)的屬性,同時為了方便查看去掉了改類中的靜態(tài)類變量和靜態(tài)類類型變量,如下: private static TheSonofTestB sonNB = new TheSonofTestB();

查看 輸出結(jié)果,如下:

同樣分析下結(jié)果: 初始化sonNB 時先去初始化其基類的靜態(tài)屬性,然后初始化TheSonofTestB的靜態(tài)屬性,接下來是父類的基本變量,父類的構(gòu)造,子類的基本變量,最后子類自己的構(gòu)造。

得出結(jié)論: 不管是本類存在繼承還是本類的類對象屬性存在繼承

在初始化時都是: 父類的靜態(tài)屬性—->子類的靜態(tài)屬性—->父類的基本類型屬性—->父類的構(gòu)造—>子類的基本屬性—->子類的構(gòu)造

這里寫圖片描述

寫在最后

最后我想說2點:

1:不管存在不存在繼承,靜態(tài)的屬性—>非靜態(tài)的屬性—->構(gòu)造方法 都是初始化的順序,存在繼承時,依然一樣,只不過父類和子類的這些屬性交替進行

2:思考問題: 子類如果覆蓋了父類的靜態(tài)屬性,那么調(diào)用子類的靜態(tài)屬性時,靜態(tài)屬性的值應(yīng)該是什么?子類是靜態(tài)屬性共有幾個?各位可自行試驗

到此這篇關(guān)于Java類初始化順序詳解的文章就介紹到這了,更多相關(guān)Java類初始化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中toString函數(shù)的使用示例代碼

    Java中toString函數(shù)的使用示例代碼

    toString()函數(shù)用于將當(dāng)前對象以字符串的形式返回,比如我定義了一個User類,創(chuàng)建了一個user對象,然后使用相應(yīng)命令去打印user對象,本文結(jié)合示例代碼介紹了toString函數(shù)的使用,需要的朋友可以參考下
    2024-02-02
  • Java 深入淺出掌握Map集合之雙列集合

    Java 深入淺出掌握Map集合之雙列集合

    雙列集合是每個元素都有鍵與值兩部分組成的集合,記錄的是鍵值對對應(yīng)關(guān)系,即通過鍵可以找到值,鍵必須是唯一,值可以重復(fù),接下來跟著小編具體了解吧
    2021-11-11
  • 詳解Spring Cloud Gateway 數(shù)據(jù)庫存儲路由信息的擴展方案

    詳解Spring Cloud Gateway 數(shù)據(jù)庫存儲路由信息的擴展方案

    這篇文章主要介紹了詳解Spring Cloud Gateway 數(shù)據(jù)庫存儲路由信息的擴展方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • myBatis的mapper映射文件之批量處理方式

    myBatis的mapper映射文件之批量處理方式

    這篇文章主要介紹了myBatis的mapper映射文件之批量處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Druid簡單實現(xiàn)數(shù)據(jù)庫的增刪改查方式

    Druid簡單實現(xiàn)數(shù)據(jù)庫的增刪改查方式

    這篇文章主要介紹了Druid簡單實現(xiàn)數(shù)據(jù)庫的增刪改查方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 教你使用java實現(xiàn)去除各種空格

    教你使用java實現(xiàn)去除各種空格

    本文給大家匯總介紹了5種java中去除空格的方法,分別是String.trim()、str.replace(" ", "");、replaceAll(" +","");以及自定義的remove函數(shù),非常的簡單實用,需要的小伙伴可以參考下。
    2015-03-03
  • 在springboot中如何使用filter設(shè)置要排除的URL

    在springboot中如何使用filter設(shè)置要排除的URL

    這篇文章主要介紹了在springboot中如何使用filter設(shè)置要排除的URL,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java中IO流 字節(jié)流實例詳解

    Java中IO流 字節(jié)流實例詳解

    這篇文章主要介紹了Java中IO流 字節(jié)流實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Java Fluent Mybatis實戰(zhàn)之構(gòu)建項目與代碼生成篇上

    Java Fluent Mybatis實戰(zhàn)之構(gòu)建項目與代碼生成篇上

    Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。國內(nèi)又以Mybatis用的多,基于mybatis上的增強框架,又有mybatis plus和TK mybatis等。今天我們介紹一個新的mybatis增強框架 fluent mybatis
    2021-10-10
  • Java基于Google zxing生成帶logo的二維碼圖片

    Java基于Google zxing生成帶logo的二維碼圖片

    zxing是一個開放源碼的,用java實現(xiàn)的多種格式的1D/2D條碼圖像處理庫,本文主要介紹了Java基于Google zxing生成帶logo的二維碼圖片,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10

最新評論