本文目錄一覽:
Java的靜態塊和初始化塊分別何時執行?有什麼區別?
靜態初始化塊:當類第一次載入時執行。
非靜態初始化塊:非靜態初始化塊會在構造函數執行時,且在構造函數主體代碼執行之前被執行。
區別如下:
1、執行次數不同
靜態塊只執行一次,初始化塊可以執行多次。
2、作用不同
靜態初始化塊僅能初始化類變數,即static修飾的數據成員。
非靜態初始化塊可以初始化類的實例變數。
擴展資料:
使用Java靜態代碼塊注意事項:
1、它是隨著類的載入而執行,只執行一次,並優先於主函數。具體說,靜態代碼塊是由類調用的。類調用時,先執行靜態代碼塊,然後才執行主函數的。
2、靜態代碼塊其實就是給類初始化的,而構造代碼塊是給對象初始化的。
3、靜態代碼塊中的變數是局部變數,與普通函數中的局部變數性質沒有區別。
4、一個類中可以有多個靜態代碼塊。
5、對於靜態變數、靜態初始化塊、變數、初始化塊、構造器,它們的初始化順序依次是(靜態變數、靜態初始化塊)(變數、初始化塊)構造器。
JAVA中 靜態塊的作用
我先說一下靜態塊吧,下面就是一個靜態塊,
static
{
}
靜態塊的特點是在類載入的時候就執行,先說一下類載入,一個程序要想運行,首先要把代碼載入到內存中對吧?然後才能去和CPU交流,這是馮諾依曼計算機規定的。Java也是一樣,Java的.class位元組碼文件要想執行,首先也要載入到內存,由類載入器把位元組碼文件的代碼載入到內存中,這一步就叫類載入,這是首先要進行的。
public
class
Test
{
static
{
System.out.println(“我是靜態塊”);
}
}
當創建Test類的一個對象的時候,比如new
Test()
,是這樣,首先是類載入,然後才能new對象,靜態塊在類載入的時候就執行了,這就說明靜態塊在new對象之前就會執行,而且一個類在第一次被使用的時候會被載入,然後在整個應用程序的生命周期當中不會再次被載入了,就載入這一次,所以這就說明,靜態塊就執行一次,不會執行第二遍!
public
class
Test
{
public
Test()
{//
構造方法
System.out.println(“我是構造方法,創建對象的時候我會執行,我執行完,對象就造出來了”);
}
static
{
System.out.println(“我是靜態塊,類載入的時候我就執行了,而且只執行這一次”);
}
}
然後這樣:
new
Test();
new
Test();
你會發現首先列印出靜態塊的信息,然後才列印出構造方法信息,然後再次new
Test();的時候,只列印出了構造方法的信息,這個例子證明了我上面說的是對的!
這就是靜態塊,我說完了,至於你說的
靜態塊中初始化Map。
初始化這幾個字很難講他的意思,意思包括
把一些內容設為默認狀態、把沒準備的準備好、在什麼什麼之前就怎麼怎麼樣、將變數賦為默認值,等等,這個不能精確的說,只能就事說事,下面就可以說是在靜態塊中初始化Map,
public
class
Test
{
private
static
Map
m;
static
{
m
=
new
HashMap();
}
}
就說道這兒,樓主
看了一個帖子
寫的是初始化Map的,
如果還有疑問
不如把地址貼出來,大家也好幫你,就光說初始化Map,這個問的太叫人沒法回答了。
java static塊有什麼具體的作用和注意事項?
在Java語言中,static表示「全局」或者「靜態」的意思,用來修飾成員變數和成員方法,也可以形成靜態static代碼塊,但是Java語言中沒有全局變數的概念。
被static修飾的成員變數和成員方法獨立於該類的任何對象。也就是說,它不依賴類特定的實例,被類的所有實例共享。只要這個類被載入,Java虛擬機就能根據類名在運行時數據區的方法區內定找到他們。因此,static對象可以在它的任何對象創建之前訪問,無需引用任何對象。
用public修飾的static成員變數和成員方法本質是全局變數和全局方法,當聲明它類的對象時,不生成static變數的副本,而是類的所有實例共享同一個static變數。
static變數前可以有private修飾,表示這個變數可以在類的靜態代碼塊中,或者類的其他靜態成員方法中使用(當然也可以在非靜態成員方法中使用),但是不能在其他類中通過類名來直接引用,這一點很重要。實際上你需要搞明白,private是訪問許可權限定,static表示不要實例化就可以使用,這樣就容易理解多了。static前面加上其它訪問許可權關鍵字的效果也以此類推。
static修飾的成員變數和成員方法習慣上稱為靜態變數和靜態方法,可以直接通過類名來訪問,訪問語法為:
類名.靜態方法名(參數列表…)
類名.靜態變數名
用static修飾的代碼塊表示靜態代碼塊,當Java虛擬機(JVM)載入類時,就會執行該代碼塊(用處非常大)。
static在Java語言中的使用有四種:(變數、方法、代碼塊、內部類)
1、static變數
按照是否靜態的對類成員變數進行分類可分兩種:一種是被static修飾的變數,叫靜態變數或類
變數;另一種是沒有被static修飾的變數,叫實例變數。
兩者的區別是:
對於靜態變數在內存中只有一個拷貝(節省內存),JVM只為靜態分配一次內存,在載入類的過
程中完成靜態變數的內存分配,可用類名直接訪問(方便),當然也可以通過對象來訪問(但是這是不推薦的)。
對於實例變數,沒創建一個實例,就會為實例變數分配一次內存,實例變數可以在內存中有多個拷貝,互不影響(靈活)。
2、靜態方法
靜態方法可以直接通過類名調用,任何的實例也都可以調用,因此靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的實例變數和實例方法(就是不帶static的成員變數和成員成員方法),只能訪問所屬類的靜態成員變數和成員方法。因為實例成員與特定的對象關聯!這個需要去理解,想明白其中的道理,不是記憶!!!
因為static方法獨立於任何實例,因此static方法必須被實現,而不能是抽象的abstract。
3、static代碼塊
static代碼塊也叫靜態代碼塊,是在類中獨立於類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM載入類時會執行這些靜態的代碼塊,如果static代碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個代碼塊只會被執行一次。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/183030.html