亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java類初始化順序詳解

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

Java 類初始化介紹

java語(yǔ)言在使用過(guò)程中最先開(kāi)始就是初始化,在工作中如果遇到什么問(wèn)題需 要定位往往到最后也可能是初始化的問(wèn)題,因此掌握初始化的順序很重要。

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

這里寫(xiě)圖片描述

簡(jiǎn)單介紹下圖的意思,java類對(duì)象初始化主要包括:

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

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

無(wú)繼承關(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");
}

接下來(lái)是運(yùn)行結(jié)果:

這里寫(xiě)圖片描述

結(jié)果分析:

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

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

得出結(jié)論:無(wú)繼承關(guān)系時(shí)的初始化順序 靜態(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)的屬性,同時(shí)為了方便查看去掉了改類中的靜態(tài)類變量和靜態(tài)類類型變量,如下: private static TheSonofTestB sonNB = new TheSonofTestB();

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

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

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

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

這里寫(xiě)圖片描述

寫(xiě)在最后

最后我想說(shuō)2點(diǎn):

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論