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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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

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

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

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

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

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

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

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

下面通過例子來說明:

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 静态的自由块和非静态的自由块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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