日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java自由块_JAVA 静态的自由块和非静态的自由块

發(fā)布時(shí)間:2025/3/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java自由块_JAVA 静态的自由块和非静态的自由块 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java中的自由塊分為靜態(tài)的自由塊和非靜態(tài)的自由塊,這兩種的執(zhí)行是有區(qū)別的。

非靜態(tài)自由塊的執(zhí)行時(shí)間是:在執(zhí)行構(gòu)造函數(shù)之前。

靜態(tài)自由塊的執(zhí)行時(shí)間是:class文件加載時(shí)執(zhí)行。

執(zhí)行的時(shí)間不同,造成的結(jié)果是:非靜態(tài)自由塊可以多次執(zhí)行,只要初始化一個(gè)對(duì)象就會(huì)執(zhí)行,但是靜態(tài)自由塊只會(huì)在類(lèi)裝載的時(shí)候執(zhí)行一次,一般用來(lái)初始化類(lèi)的靜態(tài)變量的值。

每次初始化一個(gè)對(duì)象,都會(huì)導(dǎo)致一次非靜態(tài)塊的執(zhí)行。如果涉及到繼承關(guān)系,則是:首先執(zhí)行父類(lèi)的非靜態(tài)塊,然后是父類(lèi)的構(gòu)造函數(shù),接著是自己的自由塊,最后是自己的構(gòu)造函數(shù)。

靜態(tài)塊的執(zhí)行時(shí)機(jī)是在class文件裝載的時(shí)候,由于class文件只會(huì)裝載一次,因此靜態(tài)塊只會(huì)執(zhí)行一次,后面再使用這個(gè)類(lèi)時(shí),不會(huì)再執(zhí)行靜態(tài)塊中的代碼。

更 細(xì)致的分析class裝載的過(guò)程,其實(shí)靜態(tài)塊的執(zhí)行時(shí)機(jī)是在class裝載后的初始化階段。如果采用ClassLoader的loadclass來(lái)僅僅裝 載類(lèi)而不初始化,是不會(huì)觸發(fā)靜態(tài)塊的執(zhí)行的。采用Class的forname(String)是采用了默認(rèn)的initialize為true的情況,也就 是初始化了。如果使用forname(String name,boolean initialize, ClassLoader loader),設(shè)置initialize為false,同樣不會(huì)執(zhí)行靜態(tài)塊。

在執(zhí)行class裝載后的初始化階段包括:運(yùn)行方法,這個(gè)方法中就是類(lèi)變量的初始化語(yǔ)句和靜態(tài)自由塊語(yǔ)句。這個(gè)方法是由java的編譯器收集信息后生成的,不能顯示的調(diào)用。

下面通過(guò)例子來(lái)說(shuō)明:

father.java

package?freeblock;

public?class?father {

static{//靜態(tài)塊

System.out.println("father'sSTATIC free block running");

}

{//非靜態(tài)塊

System.out.println("father'sfree block running");

}

public?father(){

System.out.println("father'sconstructor running");

}

}

son.java

package?freeblock;

public?class?son?extends?father{

static{//靜態(tài)塊

System.out.println("son'sSTATIC free block running");

}

{//非靜態(tài)塊

System.out.println("son's freeblock running");

}

public?son() {

//?TODO?Auto-generated constructor stub

System.out.println("son'sconstructor running");

}

}

client.java

package?freeblock;

public?class?client {

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

Class?f;

try?{

System.out.println("--------beforeload father--------");

f=Class.forName("freeblock.father");

//??f=Class.forName("freeblock.father",false,ClassLoader.getSystemClassLoader());

System.out.println("--------afterload father---------");

System.out.println("--------beforeinitial father object--------");

f.newInstance();

System.out.println("--------afterinitial father object--------");

}?catch?(ClassNotFoundException e) {

e.printStackTrace();

}?catch?(InstantiationException e) {

e.printStackTrace();

}?catch?(IllegalAccessException e) {

e.printStackTrace();

}

Class?s;

try?{

System.out.println("-------beforeload son--------");

s=Class.forName("freeblock.son");

System.out.println("--------afterload son-------");

System.out.println("--------beforeinitial son object----------");

s.newInstance();

System.out.println("--------afterinitial son object-----------");

}?catch?(ClassNotFoundException e) {

e.printStackTrace();

}?catch?(InstantiationException e) {

e.printStackTrace();

}?catch?(IllegalAccessException e) {

e.printStackTrace();

}

}

}

執(zhí)行結(jié)果:

--------before loadfather--------

father's STATIC free blockrunning

--------after loadfather---------

--------before initial fatherobject--------

father's free block running

father's constructor running

--------after initial fatherobject--------

-------before load son--------

son's STATIC free block running

--------after load son-------

--------before initial sonobject----------

father's free block running

father's constructor running

son's free block running

son's constructor running

--------after initial son object-----------

總結(jié)

以上是生活随笔為你收集整理的java自由块_JAVA 静态的自由块和非静态的自由块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。